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