簡體   English   中英

如何查找列表的交集和並集(不使用集合)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM