Python实现求多个集合之间的并集
目的:求多个集合之前的并集,例如:现有四个集合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实现求多个集合之间的并集的更多相关文章
- 第四节 Python基础之数据类型(集合)
在学习本节之前,我们先对数据类型做一个补充,也就是数据类型的分类: 按照可变和不可变来分: 可变:列表,字典 不可变:数字,字符串,元组 按照访问顺序来分: 顺序访问:字符串,列表,元组 映射的方式访 ...
- Python数据类型(字典和集合)
1.5 Dictionary(字典) 在Python中,字典用放在花括号{}中一系列键-值对表示.键和值之间用冒号分隔,键-值对之间用逗号分隔. 在字典中,你想存储多少个键-值对都可以.每个键都与一个 ...
- python 字典,列表,集合,字符串,基础进阶
python列表基础 首先当然是要说基础啦 列表list 1.L.append(object) -> None 在列表末尾添加单个元素,任何类型都可以,包括列表或元组等 2.L.extend(i ...
- python大法好——字典、集合
字典 前面我们说过列表,它适合于将值组织到一个结构中并且通过编号对其进行引用.字典则是通过名字来引用值的数据结构,并且把这种数据结构称为映射,字典中的值没有特殊的顺序,都存储在一个特定的键(key)下 ...
- 《转》python学习(10)-集合
转自 http://www.cnblogs.com/BeginMan/p/3160565.html 一.目录 1.集合概述 2.关于集合的操作符.关系符号 3.集合的一系列操作(添加.更新.访问.删除 ...
- python 操作redis之——有序集合(sorted set) (七)
#coding:utf8 import redis r =redis.Redis(host=") 1.Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中.如果某个成员已经是有序 ...
- Python初学者第十天 集合、十六进制
10day 数据类型:集合 set 1.集合的定义 集合:无序的.不重复的数据组合. 特性:a.去重,把一个列表变成集合,就自动去重了 b.关系测试.测试两组数据之间的交集.差集.并集等关系 2.集合 ...
- java求两个集合的交集和并集,比较器
求连个集合的交集: import java.util.ArrayList; import java.util.List; public class TestCollection { public st ...
- 如何求ArrayList集合的交集 并集 差集 去重复并集
需要用到List接口中定义的几个方法: addAll(Collection<? extends E> c) :按指定集合的Iterator返回的顺序将指定集合中的所有元素追加到此列表的末尾 ...
随机推荐
- 获取redis实例绑定cpu的情况
redis是一个单线模型的nosql类型的数据库,而目前接触到的服务器大都是多核的,比如8c,16c,32c,64c等等.为了充分利用主机,在一台主机上必然会部署多个redis实例,默认情况cpu会随 ...
- WIN10与ubuntu双系统安装教程
按照网上博客的安装教程安装的Win10+Ubuntu16.04双系统安装了好几遍都不成功?启动Ubuntu左上一直有个光标在闪?如果你的电脑也是双硬盘(装Windows系统的固态硬盘+机械硬盘),在安 ...
- 论文-MobileNet-V1、ShuffleNet-V1、MobileNet-V2、ShuffleNet-V2、MobileNet-V3
1.结构对比 1)MobileNet-V1 2)ShuffleNet-V1 3)MobileNet-V2 4)ShuffleNet-V2
- BZOJ#2121. 字符串游戏 [区间dp]
// powered by c++11 // by Isaunoya #include<bits/stdc++.h> #define rep(i , x , y) for(register ...
- P3759 [TJOI2017]不勤劳的图书管理员 [树套树]
树套树是什么啊我不知道/dk 我只知道卡常数w // by Isaunoya #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC o ...
- 微信小程序直播资料整理
可以通过此脑图大概了解小程序直播内容:https://developers.weixin.qq.com/community/develop/article/doc/0002a62b3749f088fa ...
- ovs安装教程
原文链接:https://www.cnblogs.com/goldsunshine/p/10331606.html Open vSwitch系列之二 安装指定版本ovs Open vSwitch系 ...
- ASP.NET常用内置对象(二)Response
response翻译为中文:响应. 将数据作为请求的结果从服务器发送到客户浏览器中,并提供有关响应的消息.它可用来在页面中输出数据,在页面中跳转,还可以传递各个页面的参数. Response对象是Sy ...
- 小白月赛22 B : 树上子链
B:树上子链 考察点 : 树的直径 坑点 : long long, 是点权不是边权 一个点也算一条链 析题得侃: 关于树的直径 这道题考察的是树的直径,最好用树形DP来写,具体解释详见上述博客, 这道 ...
- vsftpd最详细的配置文件
vsftpd作为一个主打安全的FTP服务器,有很多的选项设置.下面介绍了vsftpd的配置文件列表,而所有的配置都是基于vsftpd.conf这个配置文件的.本文将提供完整的vsftpd.conf的中 ...