2016-12-06 43 views
3

我想匹配兩個列表,但我也想要重複匹配。我不能使用set,因爲這隻會在下面的第二個示例中給出{3}。Python - 在兩個列表中獲得重複匹配

a = [1,2,3,4] 
b = [3,3,4,5] 
return [3,4] 

a = [1,2,3,3] 
b = [3,3,4,5] 
return [3,3] 
+1

'C = X的X在b]' –

+0

@讓 - 弗朗索瓦法布爾我不認爲這就是他的意思。 'a = [3,3]; b = [3]'只有在我認爲的時候才匹配。這是一個列表交集。 – kabanus

+0

我有疑問,或者我會回答 –

回答

3

您可以使用列表comprehesion檢查和a回到每一個項目,如果它在b存在象下面這樣:如果你想只在兩種ab元素

[item for item in a if item in b] 

(以覆蓋@kabanus在評論中提到的情況),您可以使用以下內容:

[item for item in set(a) for i in range(min(a.count(item), b.count(item)))] 

輸出:

>>> a = [1, 2, 3, 4] 
>>> b = [3, 3, 4, 5] 
>>> [item for item in set(a) for i in range(min(a.count(item), b.count(item)))] 
[3, 4] 
>>> 
>>> a = [1, 2, 3, 3] 
>>> b = [3, 3, 4, 5] 
>>> [item for item in set(a) for i in range(min(a.count(item), b.count(item)))] 
[3, 3] 
>>> 
>>> a = [3, 3, 4] 
>>> b = [4, 4, 3] 
>>> [item for item in set(a) for i in range(min(a.count(item), b.count(item)))] 
[3, 4] 
+0

請參閱我對OP的評論。 'a = [3,3]; b = [3]'應該只匹配一次,我想,就像一個十字路口一樣,你會匹配兩次。 – kabanus

+0

你的函數對於'a = [3,3,4]; b = [4,4,3]',(4出現兩次)的結果失敗了,但是差不多。我會投票,如果你讓它工作。情況太微不足道了。 – kabanus

1

試着這麼做(如果順序並不重要),Python的2:

from collections import Counter 

a = [1,2,3,4] 
b = [3,3,4,5] 
ca=Counter(a) 
cb=Counter(b) 
print sum([[x]*min(ca[x],cb[x]) for x in set(a)],[]) 

這將返回所有重複匹配的列表中,他們重複的次數,用除了將相同的元素分組在一起之外沒有特別的排序在上面的例子中的輸出是:

[3,4] 

我假設你錯過4.你有你的產量貼什麼其他例如:在當x

[3,3] 
+0

是的,我確實想念4(編輯),我想這是做我想做的,謝謝! – jackonator