2016-12-06 7 views
3

2つのリストを照合しようとしていますが、繰り返しの一致も取得したいと思います。下の2番目の例では{3}しか得られないので、setを使うことはできません。Python - 2つのリストで繰り返し一致を取得する

[item for item in a if item in b] 

あなたはabの両方にある要素のみ(にしたい場合は:あなたは、それは以下のようにbに存在する場合a内のすべての項目をチェックして返すために、リストcomprehesionを使用することができます

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のx:は

[3,4] 

私はあなたがあなたが投稿何収量を持つ4に他の例を逃したと仮定していますin b] ' –

+0

@ Jean-FrançoisFabre私はそれが彼が意味するものだとは思わない。 'a = [3,3]; b = [3]'は私が思っていれば一応一致すると思われます。リストの交差点です。 – kabanus

+0

私は疑いがあった、または私は答えただろう –

答えて

3

コメントで@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は2回現れます)結果ではなくほとんど失敗します。あなたがそれを効かせるなら、私は投票するつもりです。条件はあまりにも簡単です。 – 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,3] 
+0

はい私は4(編集)が欠けていた、私はこれが私がやりたいと思っていると思う、ありがとう! – jackonator

関連する問題