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 def func(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 & c4
13     if all_union_elems:
14         print ('all collections have elems: ', all_union_elems)
15 
16     # three collections have
17     c1 = c1 - all_union_elems
18     c2 = c2 - all_union_elems
19     c3 = c3 - all_union_elems
20     c4 = c4 - all_union_elems
21     c123_union_elems = c1 & c2 & c3
22     c124_union_elems = c1 & c2 & c4
23     c134_union_elems = c1 & c3 & c4
24     c234_union_elems = c2 & c3 & c4
25     if c123_union_elems:
26         print ("c123_union_elems ", c123_union_elems)
27     if c124_union_elems:
28         print ("c124_union_elems ", c124_union_elems)
29     if c134_union_elems:
30         print ("c134_union_elems ", c134_union_elems)
31     if c234_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_elems
36     c2 = c2 - c123_union_elems - c124_union_elems - c234_union_elems
37     c3 = c3 - c123_union_elems - c134_union_elems - c234_union_elems
38     c4 = c4 - c124_union_elems - c134_union_elems - c234_union_elems
39     c12_union_have = c1 & c2
40     c13_union_have = c1 & c3
41     c14_union_have = c1 & c4
42     c23_union_have = c2 & c3
43     c24_union_have = c2 & c4
44     c34_union_have = c3 & c4
45     if c12_union_have:
46         print ("c12_union_have ", c12_union_have)
47     if c13_union_have:
48         print ("c13_union_have ", c13_union_have)
49     if c14_union_have:
50         print ("c14_union_have ", c14_union_have)
51     if c23_union_have:
52         print ("c23_union_have ", c23_union_have)
53     if c24_union_have:
54         print ("c24_union_have ", c24_union_have)
55     if c34_union_have:
56         print ("c34_union_have ", c34_union_have)
57 
58     c1 = c1 - c12_union_have - c13_union_have - c14_union_have
59     c2 = c2 - c12_union_have - c23_union_have - c24_union_have
60     c3 = c3 - c13_union_have - c23_union_have - c34_union_have
61     c4 = c4 - c14_union_have - c24_union_have - c34_union_have
62     if c1:
63         print ('only c1 have ', c1)
64     if c2:
65         print ('only c2 have ', c2)
66     if c3:
67         print ('only c3 have ', c3)
68     if c4:
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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM