目的:求多个集合之前的并集,例如:现有四个集合C1 = {11, 22, 13, 14}、C2  = {11, 32, 23, 14, 35}、C3 = {11, 22, 38}、C4 = {11, 22, 33, 14, 55, 66},则它们之间的并集应该为:

C1 & C2 & C3 = {11}、C1 & C2 & C4 = {14}、C1 & C3 & C4 = {22}。如下图所示:

实现方法:Python自带了set数据类型,并且可以实现求集合的并集、交集、差集等,十分好用。按照一般的数学方法实现,实现的步骤如下:

(1)先求4个集合共有的成员;

(2)每个集合减去所有集合的共有成员,在求其中任意3个集合共有的成员;

(3)每个集合减去包含自己的任意三个集合的共有成员,最后求其中任意两个集合共有的成员。

具体的代码如下:

 # encoding: utf-8

 def func(content):
# 使用集合实现, 使用集合真是太方便了 c1 = set(content[0]) # [11, 22, 13, 14]
c2 = set(content[1]) # [11, 32, 23, 14, 35]
c3 = set(content[2]) # [11, 22, 38]
c4 = set(content[3]) # [11, 22, 33, 14, 55, 66] # all collections have element
all_union_elems = c1 & c2 & c3 & c4
if all_union_elems:
print ('all collections have elems: ', all_union_elems) # three collections have
c1 = c1 - all_union_elems
c2 = c2 - all_union_elems
c3 = c3 - all_union_elems
c4 = c4 - all_union_elems
c123_union_elems = c1 & c2 & c3
c124_union_elems = c1 & c2 & c4
c134_union_elems = c1 & c3 & c4
c234_union_elems = c2 & c3 & c4
if c123_union_elems:
print ("c123_union_elems ", c123_union_elems)
if c124_union_elems:
print ("c124_union_elems ", c124_union_elems)
if c134_union_elems:
print ("c134_union_elems ", c134_union_elems)
if c234_union_elems:
print ("c234_union_elems ", c234_union_elems) # two collections have
c1 = c1 - c123_union_elems - c124_union_elems - c134_union_elems
c2 = c2 - c123_union_elems - c124_union_elems - c234_union_elems
c3 = c3 - c123_union_elems - c134_union_elems - c234_union_elems
c4 = c4 - c124_union_elems - c134_union_elems - c234_union_elems
c12_union_have = c1 & c2
c13_union_have = c1 & c3
c14_union_have = c1 & c4
c23_union_have = c2 & c3
c24_union_have = c2 & c4
c34_union_have = c3 & c4
if c12_union_have:
print ("c12_union_have ", c12_union_have)
if c13_union_have:
print ("c13_union_have ", c13_union_have)
if c14_union_have:
print ("c14_union_have ", c14_union_have)
if c23_union_have:
print ("c23_union_have ", c23_union_have)
if c24_union_have:
print ("c24_union_have ", c24_union_have)
if c34_union_have:
print ("c34_union_have ", c34_union_have) c1 = c1 - c12_union_have - c13_union_have - c14_union_have
c2 = c2 - c12_union_have - c23_union_have - c24_union_have
c3 = c3 - c13_union_have - c23_union_have - c34_union_have
c4 = c4 - c14_union_have - c24_union_have - c34_union_have
if c1:
print ('only c1 have ', c1)
if c2:
print ('only c2 have ', c2)
if c3:
print ('only c3 have ', c3)
if c4:
print ('only c4 have ', c4) if __name__ == "__main__": content = [[11, 22, 13, 14], [11, 32, 23, 14, 35], [11, 22, 38], [11, 22, 33, 14, 55, 66]] func(content)

输出结果如下:

 all collections have elems:  {11}
c124_union_elems {14}
c134_union_elems {22}
only c1 have {13}
only c2 have {32, 35, 23}
only c3 have {38}
only c4 have {33, 66, 55}

这种实现方法其实效率不高,需要比较集合的次数为:1 + 4 + 6 = 11次,另外代码也很冗余,并不是一种好的实现方式。

还有另外一种效率高的实现方式:

(1)首先,先找出成员数最多的那个集合,这里就是集合C4;

(2)将集合C4中的每个成员依次和其它集合进行比较,看其它集合中是否包含此成员;

(3)若其它集合中包括这个成员,就将这个成员从集合中去除,依次这样比较每个集合;

(4)比较一轮之后,集合C4中剩余的成员就是只有自己的成员。

(5)再在除C4以外剩下的集合中,找出成员数最多的集合,重复上诉操作。依次类推,就可以求出各集合之间的并集了。

上述算法中需要比较的次数只有3 + 2 + 1 = 6次。这种思路实现的代码可参考我的另一篇博客:https://www.cnblogs.com/mrlayfolk/p/12383674.html

Python实现求多个集合之间的并集的更多相关文章

  1. 第四节 Python基础之数据类型(集合)

    在学习本节之前,我们先对数据类型做一个补充,也就是数据类型的分类: 按照可变和不可变来分: 可变:列表,字典 不可变:数字,字符串,元组 按照访问顺序来分: 顺序访问:字符串,列表,元组 映射的方式访 ...

  2. Python数据类型(字典和集合)

    1.5 Dictionary(字典) 在Python中,字典用放在花括号{}中一系列键-值对表示.键和值之间用冒号分隔,键-值对之间用逗号分隔. 在字典中,你想存储多少个键-值对都可以.每个键都与一个 ...

  3. python 字典,列表,集合,字符串,基础进阶

    python列表基础 首先当然是要说基础啦 列表list 1.L.append(object) -> None 在列表末尾添加单个元素,任何类型都可以,包括列表或元组等 2.L.extend(i ...

  4. python大法好——字典、集合

    字典 前面我们说过列表,它适合于将值组织到一个结构中并且通过编号对其进行引用.字典则是通过名字来引用值的数据结构,并且把这种数据结构称为映射,字典中的值没有特殊的顺序,都存储在一个特定的键(key)下 ...

  5. 《转》python学习(10)-集合

    转自 http://www.cnblogs.com/BeginMan/p/3160565.html 一.目录 1.集合概述 2.关于集合的操作符.关系符号 3.集合的一系列操作(添加.更新.访问.删除 ...

  6. python 操作redis之——有序集合(sorted set) (七)

    #coding:utf8 import redis r =redis.Redis(host=") 1.Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中.如果某个成员已经是有序 ...

  7. Python初学者第十天 集合、十六进制

    10day 数据类型:集合 set 1.集合的定义 集合:无序的.不重复的数据组合. 特性:a.去重,把一个列表变成集合,就自动去重了 b.关系测试.测试两组数据之间的交集.差集.并集等关系 2.集合 ...

  8. java求两个集合的交集和并集,比较器

    求连个集合的交集: import java.util.ArrayList; import java.util.List; public class TestCollection { public st ...

  9. 如何求ArrayList集合的交集 并集 差集 去重复并集

    需要用到List接口中定义的几个方法: addAll(Collection<? extends E> c) :按指定集合的Iterator返回的顺序将指定集合中的所有元素追加到此列表的末尾 ...

随机推荐

  1. 动态加载js文件是异步的

    动态加载js文件是异步的. 今天调试一个错误,一个js方法各种调不到. 原因是因为所调方法的js文件是动态加载进来的. <script type="text/javascript&qu ...

  2. Vmvare扩展虚拟机磁盘大小

    Vmvare设置好虚拟机的磁盘大小之后,发现磁盘空间不够了,这个时候怎么扩展磁盘的大小呢? 首先,在确保虚拟机关闭的情况下,右键设置,选择硬盘,扩展,这样就可以增加磁盘的大小. 但是由于未进行分区和磁 ...

  3. ROS 环境变量配置

    unbantu16.04 linux 版本,  ros系统 kinetic版本 1. ros系统可以通过rospack find  package_name  /   rosrun package_n ...

  4. #AcWing系列课程Level-2笔记——1. 快速排序算法

    快速排序算法(冒泡排序算法的升级版) 编写快速排序,记住下面的思路,代码也就游刃有余了! 1.首先确定分界点:分界点设为x,可以取q[left],q[(left+right)>>2],q[ ...

  5. P1980 计数问题(int,string,stringstream)

    题目描述 试计算在区间 1 到 n 的所有整数中,数字x(0 ≤ x ≤ 9)共出现了多少次?例如,在 1 到 11 中,即在 1,2,3,4,5,6,7,8,9,10,11 中,数字 1 出现了 4 ...

  6. AOP配置步骤(XML)

    1.maven依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  7. 【NLP】暑假课作业3 - 词性标注(简单词频概率统计)

    作业任务: 使用98年人民日报语料库进行词性标注训练及测试. 作业输入: 98年人民日报语料库(1998-01-105-带音.txt),用80%的数据作为训练集,20%的数据作为验证集. 运行环境: ...

  8. Node.js_1.1

    Node.js简介 Node.js是一个能够在服务器端运行JavaScript的开源代码.跨平台JavaScript运行环境 Node采用Google开发的V8引擎运行js代码,使用事件驱动.非阻塞和 ...

  9. mac 中 端口占用

    1.   sudo lsof -i :5001 2.   sudo kill -9 PID

  10. 多线程模式下高并发的环境中唯一确保单例模式---DLC双端锁

    DLC双端锁,CAS,ABA问题 一.什么是DLC双端锁?有什么用处? 为了解决在多线程模式下,高并发的环境中,唯一确保单例模式只能生成一个实例 多线程环境中,单例模式会因为指令重排和线程竞争的原因会 ...