簡體   English   中英

查找兩個列表之間的交集大小

[英]Find the size of intersection between two lists

我正在嘗試編寫一個函數,該函數返回兩個列表之間的公共元素的數量。 如果元素在L1出現j次,在L2出現k次,則共享jk元素中的最小值。

例子:

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

我的想法是按升序對L1L2進行排序,然后比較每個元素:

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。有人可以告訴我哪個部分是錯誤的嗎?

我創建了dL1dL2因為我希望L1L2出於其他目的而保持不變,而且由於我是初學者,我只允許使用基本遞歸和抽象列表函數來執行此操作。

這部分在邏輯上是不正確的:

    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.

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