python 实现求一个集合的子集

概要

  今天偶然看到有个关于数学中集合的问题,就突发奇想的想用python实现下求一个集合的子集。

准备

  我当然先要复习下,什么是集合,什么是子集?

  比较粗犷的讲法,集合就是一堆确定的东西,细致一点的讲法呢,就是由一个或多个确定的元素所构成的整体,集合中的东西称为元素。

  集合有一些特性:

  1.确定性

    给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一,不允许有模棱两可的情况出现。
  2.互异性
    一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。有时需要对同一元素出现多次的情形进行刻画,可以使用多重集,其中的元素允许出现多次。
  3.无序性
  一个集合中,每个元素的地位都是相同的,元素之间是无序的。集合上可以定义序关系,定义了序关系后,元素之间就可以按照序关系排序。但就集合本身的特性而言,元素之间没有必然的序。

  集合也有些相关的概念:

  1.空集

    这类集合不包含任何元素,它是任何一个非空集合的真子集,同时它也是任何一个集合的子集。

  2.子集

    如果有两个集合,S,T,对于S中的任何一个元素,都能在T中找到,那么称S是T的子集

  3.真子集

    如果有两个集合,S,T,其中,S是T的子集,但是在T中存在元素不属于S,那么称S是T的真子集。

例子

下面我们就举个例子来具体说明下。

假设有集合 S=(a,b,c)

那么它的子集是(a)(b)(c)(a,b)(a,c)(b,c)(a,b,c)()

真子集是 (a)(b)(c)(a,b)(a,c)(b,c)()

我们可以看出这样一个规律(当然,简单的通过这样一个例子,好像并不能),就是假设集合中元素的个数是N,那么它子集的个数是 2N个,真子集的个数是2N-1个。

这个使我们根据定义通过主观的意识去判断的,通过代码该如何实现呢?

python实现

之前听到过一句话,talk is cheap,show me the code,说起来都是很简单的,代码实现呢?

上代码之前,先简单讲一下这其中的一些算法,通过之前的讲解,很容易就知道,对于一个集合中的元素,要么在它的集合中,要么不在,我们是不是可以利用0和1来表示,

比如上面的集合S,我们就来试一下,

(a)      --> (100)=4

(b)      --> (010)=2

(c)      --> (001)=1

(a,b)   --> (110)=6

(a,c)   --> (101)=5

(b,c)   --> (011)=3

(a,b,c)--> (111)=7

()        --> (000)=0

是不是具有一定的规律?

我们就来实现下:

# -*- coding: utf-8 -*-

list_demo = [‘a‘, ‘b‘, ‘c‘]
sub_list_all = []  # 用于存放集合所有的子集
for i in range(1 << len(list_demo)):  # 循环遍历0到2**n之间的每个数
    combo_list = []  # 用于存放每个单独的循环中取出的子集
    for j in range(len(list_demo)):
        if i & (1 << j):  # 每一个数用&操作判断改为上是否有1
            combo_list.append(list_demo[j])  # 有的话保存起来
    sub_list_all.append(combo_list)
print(len(sub_list_all))

  运行下:

E:\pythonsource\venv\Scripts\python.exe E:/pythonsource/study/subsetCompute.py
[[], [‘a‘], [‘b‘], [‘a‘, ‘b‘], [‘c‘], [‘a‘, ‘c‘], [‘b‘, ‘c‘], [‘a‘, ‘b‘, ‘c‘]]

Process finished with exit code 0

原文地址:https://www.cnblogs.com/xiaobaobei/p/9998745.html

时间: 2024-10-17 10:19:33

python 实现求一个集合的子集的相关文章

求一个集合的所有子集问题

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/31042651 作者:小马 一个包含n个元素的集合,求它的所有子集.比如集合A= {1,2,3}, 它的所有子集是: { {1}, {2}, {3}, {1,2}, {1,3}, {2,3}, {1,2,3}, @}(@表示空集). 这种问题一般有两种思路,先说说第一种,递归.递归肯定要基于一个归纳法的思想,这个思想用到了二叉树的遍历,如下图所示: 可以这样理解这张图,从集合A的每

湘潭大学OJ1199Number Game(求一个集合的最小公倍数)

题目描述 给你一个有N个数的集合S和一个数X,判断是否存在S的一个子集,子集里的数的最小公倍数正好是X. 输入 第一行是数据组数T. 接下来有多组数据,每组数据包含两行: 第一行有2个数N和X,1<=N<=100000 ,X<=10^9. 第二行给出N个数,1<=S[i]<=10^9. 输出 对于每一组数据,输出一行"Case #X: Y",X是第几组数据,Y是Yes或No. 样例输入 2 4 20 2 3 4 5 3 61 3 4 5 样例输出 Case

59-python基础-python3-集合-集合常用方法-判断一个集合是否是另一个集合的子集-issubset()-issuperset()

判断一个集合是否是另一个集合的子集-issubset()-issuperset() 1-issubset() s1.issubset(s) 判断s1是否是s的子集 2-issuperset() 与issubset()相反 原文地址:https://www.cnblogs.com/summer1019/p/11384528.html

求一个集合的全部子集 假设都是Int类型的元素

vector<int> int2bin_vec(int n, UL bit_num){ vector<int> res(bit_num, 0); auto it = res.begin() + res.size() - 1; while( n != 0){ *it = (n % 2); it--; n /= 2; } return res; } vector<int> zero_one2subset(const vector<int>& zero_o

C#中判断一个集合是另外一个集合的子集

有这样的两个集合: string[] bigArr = new string[] { "a", "b", "c" };string[] smallArr = new string[] { "a", "b"}; 现在需要判断smallArr是否是bigArr的子集.只要拿着bigArray和smallArr比较,求差集,如果差集的个数大于0,就说明smallArr是bigArr的子集. //在大集合的基础上,

求一个集合的集合下所有集合元素求值

场景是这样的:Order下有一个Suppler的集合,即一个订单下可能有多个供应商:Supplier下有一个Product的集合,即对一个供应商采购多个产品. 需求是这样的:算出所有订购产品的总价 模型这样: public class Order { public int OrderId { get; set; } public ICollection<Supplier> Suppliers { get; set; } public Order() { Suppliers = new List

Python 全栈开发二 python基础 字符串 字典 集合

一.字符串 1,在python中,字符串是最为常见的数据类型,一般情况下用引号来创建字符串. 1 >>ch = "wallace" 2 >>ch1 = 'wallace' 3 >>ch2 = ''' 4 wallace 5 wallace 6 wallace 7 ''' 8 #以上三种引号都可以定义一字符串, 9 #三引号定义的字符串可以换行 注意:字符串是不可变的数据类型,关于可变与不可变将会在后文解释. 2,转义字符 在python中有一些字符是

两种求集合所有子集的方法

假设我们有一个求集合的全部子集(包含集合自身)的需求,即有一个集合s,包含两个元素 <a,b>,则其全部的子集为<a,ab,b>. 不难求得,子集个数sn与原集合元素个数n之间的关系为:sn=2^n-1. 本文分别讲述两种实现方法: 一:位图法: 1)构造一个和集合一样大小的数组A,分别与集合中的某个元素对应,数组A中的元素只有两种状态:"1"和"0",分别代表每次子集输出中集合中对应元素是否要输出,这样数组A可以看作是原集合的一个标记位图.

两种求集合全部子集的方法

如果我们有一个求集合的所有子集(包括集合自身)的需求,即有一个集合s,包括两个元素 <a,b>,则其所有的子集为<a,ab,b>. 不难求得,子集个数sn与原集合元素个数n之间的关系为:sn=2^n-1. 本文分别讲述两种实现方法: 一:位图法: 1)构造一个和集合一样大小的数组A,分别与集合中的某个元素相应,数组A中的元素仅仅有两种状态:"1"和"0",分别代表每次子集输出中集合中相应元素是否要输出.这样数组A能够看作是原集合的一个标记位图