概要

  今天偶然看到有个关于数学中集合的问题,就突发奇想的想用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

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

  1. 求一个集合的所有真子集 Python

    给定一个集合,元素均为正整数且不重复,求该集合的所有子集 # -*- coding: utf-8 -*- """ Created on Tue Oct 10 09:04: ...

  2. [python语法]python中如何判断一个集合是另一个集合的子集?

    问:python中如何判断一个集合是另一个集合的子集? 答:用issubset()方法 语法: A.issubset(B) 返回: True 如果A是B的子集. False 如果A不是B的子集. 样例 ...

  3. 求一个集合S中m个元素的所有排列以及一个数组A的全排列—递归实现版完整代码

    说明,本文全文代码均用dart语言实现. 求一个集合S中m个元素的所有排列情况,并打印,非常适合用递归的思路实现.本文给出了两种实现方法,一种是给定的填充排列数组长度是固定的,一种是可变长度的.两种方 ...

  4. 递归算法之排列组合-求一个集合S的m个元素的组合和所有可能的组合情况

    求一个集合S的m个元素组合的所有情况,并打印出来,非常适合采用递归的思路进行求解.因为集合的公式,本身就是递归推导的: C(n,m) = C(n-1,m-1) + C(n-1,m). 根据该公式,每次 ...

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

    判断一个集合是否是另一个集合的子集-issubset()-issuperset() 1-issubset() s1.issubset(s) 判断s1是否是s的子集 2-issuperset() 与is ...

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

    有这样的两个集合: string[] bigArr = new string[] { "a", "b", "c" };string[] sm ...

  7. python写的一个集合

    起因:原本打算用python写一个抢火车票的脚本.在那 期间遇见各种浏览器驱动失败的节奏....打算先缓一下 然后就去写集合了. 0x01 源码: # -*- coding:'utf-8' -*- # ...

  8. python基本数据类型之集合

    python基本数据类型之集合 集合是一种容器,用来存放不同元素. 集合有3大特点: 集合的元素必须是不可变类型(字符串.数字.元组): 集合中的元素不能重复: 集合是无序的. 在集合中直接存入lis ...

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

    一.字符串 1,在python中,字符串是最为常见的数据类型,一般情况下用引号来创建字符串. >>ch = "wallace" >>ch1 = 'walla ...

随机推荐

  1. C#:进程

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

  2. sql server 按年月日分组

    sql server  按年月日分组 ----------------------------------------------- --author:yangjinwang --date:2017- ...

  3. HTTPS通信原理

      https的实现原理https用到了多种加密算法来实现通信安全,其中两种基本的加解密算法类型解释如下:(1)对称加密:密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有DES ...

  4. Golang实现杨辉三角

    杨辉三角,也算是一个经典的题目了.就简单的说说. 写代码之前,先分析要做的东西的特点,找到规律,再把这个规律描述一下. 然后把这个描述翻译成编程语言,就可以说是编程了. 那么杨辉三角有什么特点? 首先 ...

  5. 原生JS实现简易转盘抽奖

    我爱撸码,撸码使我感到快乐. 大家好,我是Counter. 本章带大家来简单的了解下原生JS实现转盘抽奖. 因为主要涉及到JS,在这里HTML和CSS起到的功能就没有那么重要, 因此,没有过多的阐述H ...

  6. 使用MyBatis Generator 1.3.7自动生成代码

    MyBatis Generator是一款mybatis自动代码生成工具,可以通过配置后自动生成文件. MyBatis Generator有几种方法可以生成代码,下面是其中一种.  一.官网下载 MyB ...

  7. LINQ之路16:LINQ Operators之集合运算符、Zip操作符、转换方法、生成器方法

    本篇将是关于LINQ Operators的最后一篇,包括:集合运算符(Set Operators).Zip操作符.转换方法(Conversion Methods).生成器方法(Generation M ...

  8. VirtualBox for mac

    一. VirtualBox 1.下载 官网: https://www.virtualbox.org/wiki/Downloads 2.安装 傻瓜式安装即可 二.centOS7 1.下载 centOS: ...

  9. [原]Universal Windows问题:winapifamily问题:WINAPI_PARTITION_DESKTOP问题:WINAPI_PARTITION_APP问题:WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)问题

    问题回顾: 我新建的生成dll的vs问题: 此vs项目包含需要GL.h 结果此文件声明的GLint找不到! 进去发现#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITI ...

  10. HTTP协议中长连接与短连接的区别

    在HTTP/1.0中, 默认使用的是短连接.也就是说, 浏览器和服务器每进行一次HTTP操作, 就建立一次连接, 但任务结束就中断连接.如果客户端浏览器访问的某个HTML或其他类型的 Web 页中包含 ...