[英]How to find Intersection and Union of a List (without using sets)
我試圖找到一個分配的兩個列表的交集和並集,但是, 我不能使用set 。 根據集合論,兩個集合之間的交集是兩個集合中的元素。 聯合是兩個集合中的所有元素,沒有重復。 到目前為止,我有:
setA = [1,2,3,4,5,6,7,8,9]
setB = [1,5,0,9]
def getUnion(a, b):
return a + b
def getIntersection(a, b):
return
我的聯合函數返回重復項。 有沒有辦法簡單地找到工會?
另外,找到相交的最佳方法是什么?
不使用集合的並集和交集:
setA = [1,2,3,4,5,6,7,8,9]
setB = [1,5,0,9]
intersection = [i for i in setA if i in setB]
list_union = list({i: i for i in setA + setB}.values())
print(intersection)
print(list_union)
輸出:
[1, 5, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
說明 :
對於工會:
[i for i in setA if i in setB]
只需循環遍歷setA
並添加在setB
中也可以找到的setB
對於交叉點:
list({i: i for i in setA + setB}.values())
創建一個字典,其中的鍵和值是setA + setB
的結果。 由於字典中的鍵是唯一的,因此最終的字典中不會顯示重復項,並且list(dct.values())
用於僅從字典中提取所需的值。
因此,假設您可以使用sort
。 首先對兩個列表進行排序,然后使用兩個指針,每次向前移動一個值較小的指針。
對於並集函數,每次都添加所有值,並在兩個指針的值相等時向前移動兩個指針。 對於交集函數,僅當值相等時才添加值。
時間O(nlogn + n)-> O(nlogn)
您可以使用collections.Counter
代替來計算並集和交集
>>> from collections import Counter
>>> c = Counter(setA + setB)
>>> [a[0] for a in c.items() if a[1] > 1] #Intersection
>>> [1,5,9]
>>> list(c.keys()) #Union
>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Counter
對象以以下格式保存數據:
>>> c
>>> Counter({1: 2, 5: 2, 9: 2, 0: 1, 2: 1, 3: 1, 4: 1, 6: 1, 7: 1, 8: 1})
鍵是列表中的元素,值是列表中元素的出現。
嘗試這個:
setA = [1,2,3,4,5,6,7,8,9]
setB = [1,5,0,9]
print (list(set(setA).intersection(setB)))
輸出:
[1, 5, 9]
[Finished in 0.0s]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.