python中计算集合并集的是_Python实现求多个集合之间的并集-方法1

目的:求多个集合之前的并集,例如:现有四个集合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)每个集合减去包含自己的任意三个集合的共有成员,最后求其中任意两个集合共有的成员。

具体的代码如下:

1 #encoding: utf-8

2

3 deffunc(content):4 #使用集合实现, 使用集合真是太方便了

5

6 c1 = set(content[0]) #[11, 22, 13, 14]

7 c2 = set(content[1]) #[11, 32, 23, 14, 35]

8 c3 = set(content[2]) #[11, 22, 38]

9 c4 = set(content[3]) #[11, 22, 33, 14, 55, 66]

10

11 #all collections have element

12 all_union_elems = c1 & c2 & c3 &c413 ifall_union_elems:14 print ('all collections have elems:', all_union_elems)15

16 #three collections have

17 c1 = c1 -all_union_elems18 c2 = c2 -all_union_elems19 c3 = c3 -all_union_elems20 c4 = c4 -all_union_elems21 c123_union_elems = c1 & c2 &c322 c124_union_elems = c1 & c2 &c423 c134_union_elems = c1 & c3 &c424 c234_union_elems = c2 & c3 &c425 ifc123_union_elems:26 print ("c123_union_elems", c123_union_elems)27 ifc124_union_elems:28 print ("c124_union_elems", c124_union_elems)29 ifc134_union_elems:30 print ("c134_union_elems", c134_union_elems)31 ifc234_union_elems:32 print ("c234_union_elems", c234_union_elems)33

34 #two collections have

35 c1 = c1 - c123_union_elems - c124_union_elems -c134_union_elems36 c2 = c2 - c123_union_elems - c124_union_elems -c234_union_elems37 c3 = c3 - c123_union_elems - c134_union_elems -c234_union_elems38 c4 = c4 - c124_union_elems - c134_union_elems -c234_union_elems39 c12_union_have = c1 &c240 c13_union_have = c1 &c341 c14_union_have = c1 &c442 c23_union_have = c2 &c343 c24_union_have = c2 &c444 c34_union_have = c3 &c445 ifc12_union_have:46 print ("c12_union_have", c12_union_have)47 ifc13_union_have:48 print ("c13_union_have", c13_union_have)49 ifc14_union_have:50 print ("c14_union_have", c14_union_have)51 ifc23_union_have:52 print ("c23_union_have", c23_union_have)53 ifc24_union_have:54 print ("c24_union_have", c24_union_have)55 ifc34_union_have:56 print ("c34_union_have", c34_union_have)57

58 c1 = c1 - c12_union_have - c13_union_have -c14_union_have59 c2 = c2 - c12_union_have - c23_union_have -c24_union_have60 c3 = c3 - c13_union_have - c23_union_have -c34_union_have61 c4 = c4 - c14_union_have - c24_union_have -c34_union_have62 ifc1:63 print ('only c1 have', c1)64 ifc2:65 print ('only c2 have', c2)66 ifc3:67 print ('only c3 have', c3)68 ifc4:69 print ('only c4 have', c4)70

71

72 if __name__ == "__main__":73

74 content = [[11, 22, 13, 14], [11, 32, 23, 14, 35], [11, 22, 38], [11, 22, 33, 14, 55, 66]]

75

76 func(content)

输出结果如下:

1 all collections have elems: {11}2 c124_union_elems {14}3 c134_union_elems {22}4 only c1 have {13}5 only c2 have {32, 35, 23}6 only c3 have {38}7 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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值