[英]Find the size of intersection between two lists
我正在嘗試編寫一個函數,該函數返回兩個列表之間的公共元素的數量。 如果元素在L1
出現j
次,在L2
出現k
次,則共享j
和k
元素中的最小值。
例子:
L1 = [1, 2, 3, 4, 5]
L2 = [4, 2]
L3 = [1, 2, 3, 4, 4, 5, 5]
intersection_size ( L1 , L2 ) => 2
intersection_size ( L1 , L3 ) => 5
我的想法是按升序對L1
和L2
進行排序,然后比較每個元素:
def intersection(L1, L2):
dL1 = L1[:]
dL2 = L2[:]
dL1.sort()
dL2.sort()
if dL1[1:] == [] or dL2[1:] == []:
return 0
if dL1[0] == dL2[0]:
return 1 + intersection(dL1[1:], dL2[1:])
elif dL1[0] > dL2[0]:
return 0 + intersection(dL1, dL2[1:])
elif dL1[0] < dL2[0]:
return 0 + intersection(dL1[1:], dL2)
但是,當我測試intersection([1, 6, 1, 4], [1, 2, 3, 4])
,該函數給了我 1 而不是 2。有人可以告訴我哪個部分是錯誤的嗎?
我創建了dL1
和dL2
因為我希望L1
和L2
出於其他目的而保持不變,而且由於我是初學者,我只允許使用基本遞歸和抽象列表函數來執行此操作。
這部分在邏輯上是不正確的:
if dL1[1:] == [] or dL2[1:] == []:
return 0
基本情況應該是當一個或兩個列表為空時。 但是當一個或兩個列表具有單個元素時,您將返回 0。 這是不正確的,因為該元素仍然可能是匹配項,因此交集的大小不會為 0。如果將此條件更改為dL1 == [] or dL2 == []
則它可以工作:
>>> intersection(L1, L2)
2
>>> intersection(L1, L3)
5
>>> intersection([1, 6, 1, 4], [1, 2, 3, 4])
2
>>> intersection([1, 1, 1, 2, 2], [1, 1, 2, 2, 2])
4
以下將起作用
len(set(L1) & set(L3))
如果您不想使用sets
,您可以執行以下操作:
def intersection(L1, L2):
return len([x for x in L1 if x in L2])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.