簡體   English   中英

兩個列表之間的公共元素不使用Python中的集合

[英]Common elements between two lists not using sets in Python

我想要計算兩個列表的相同元素。 列表可以有重復的元素,因此我無法將其轉換為集合並使用&運算符。

a=[2,2,1,1]
b=[1,1,3,3]

設置(a)和設置(b)工作
a&b不起作用

有可能用套裝和dictonary嗎?

在Python 3.x(和Python 2.7,當它發布時),你可以使用collections.Counter

>>> from collections import Counter
>>> list((Counter([2,2,1,1]) & Counter([1,3,3,1])).elements())
[1, 1]

這是使用collections.defaultdict (Python 2.5及更高版本中提供)的替代方法。 它具有良好的屬性,結果的順序是確定性的(它基本上對應於第二個列表的順序)。

from collections import defaultdict

def list_intersection(list1, list2):
    bag = defaultdict(int)
    for elt in list1:
        bag[elt] += 1

    result = []
    for elt in list2:
        if elt in bag:
            # remove elt from bag, making sure
            # that bag counts are kept positive
            if bag[elt] == 1:
                del bag[elt]
            else:
                bag[elt] -= 1
            result.append(elt)

    return result

對於這兩種解決方案,輸出列表中任何給定元素x的出現次數是兩個輸入列表中x出現次數的最小值。 從您的問題不清楚這是否是您想要的行為。

使用集合是最有效的,但是你總是可以做r = [i for i in l1 if i in l2]

SilentGhost,Mark Dickinson和Lo'oris是對的,非常感謝報告這個問題 - 我需要列表的常見部分,所以對於:

A = [1,1,1,2]

B = [1,1,3,3]

結果應為[1,1]

很抱歉在不合適的地方發表評論 - 我今天已經注冊了。

我修改了你的解決方案:

def count_common(l1,l2):
        l2_copy=list(l2)
        counter=0
        for i in l1:
            if i in l2_copy:
                counter+=1
                l2_copy.remove(i)
        return counter

l1=[1,1,1]
l2=[1,2]
print count_common(l1,l2)

1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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