重複の可能性:
2 つのリストの共通要素の比較
私は2つのリストを持っています:
[Apples, Bananas, Pears]
[Kiwis, Bananas, Apples]
両方のリストが共有する要素のみを取得したいと思います。そのためには、Python にいくつかの組み込み関数が必要です。
結果:
[Apples, Bananas]
重複の可能性:
2 つのリストの共通要素の比較
私は2つのリストを持っています:
[Apples, Bananas, Pears]
[Kiwis, Bananas, Apples]
両方のリストが共有する要素のみを取得したいと思います。そのためには、Python にいくつかの組み込み関数が必要です。
結果:
[Apples, Bananas]
>>> set(["Apples", "Bananas", "Pears"]).intersection(["Kiwis", "Bananas", "Apples"])
set(['Bananas', 'Apples'])
>>> list(_)
['Bananas', 'Apples']
これは次と同等です:
>>>set(["Apples", "Bananas", "Pears"]) & set(["Kiwis", "Bananas", "Apples"])
set(['Bananas', 'Apples'])
元の回答:
[x for x in list1 if x in list2]
順序の維持に関するコメントの質問への回答:
そのリスト内包表記は、
intersection = []
for x in list1:
if x in list2: #Note that using 'in' involves looping over list2
intersection.append(x)
この拡張バージョンでは、何が起こっているのかを簡単に確認できます。出力リストは、削除されlist1
た要素とまったく同じです。list2
したがって、の順序が保持されlist1
ます。たとえば、 と の場合list1 = [1,2,3]
、list2 = [3,2,5]
リスト内包表記の出力は になります[2,3]
。このようにリストの位置が逆だったら
[x for x in list2 if x in list1]
次に、 の順序がlist2
出力に保持され、 が得られます[3,2]
。
また、おそらく望ましくない副作用として、これは、このメソッドに の重複した要素が含まれることを意味しますlist1
。例えば:
>>> [x for x in [1,2,3,3,3] if x in [2,3]]
[2, 3, 3, 3]
したがって、あなたの例では、これが起こります:
>>> [fruit for fruit in ["Apples", "Bananas", "Pears"] if fruit in ["Kiwis", "Bananas", "Apples"]]
['Apples', 'Bananas']
しかし、リストが反転すると、出力が逆になります。
>>> [fruit for fruit in ["Kiwis", "Bananas", "Apples"] if fruit in ["Apples", "Bananas", "Pears"]]
['Bananas', 'Apples']
したがって、一般的には、sets ソリューションの方が効率的であり、多くの場合、重複した要素が必要ないため、より優れています。ただし、秩序を維持したい場合は、これが最適です。(順序を維持して重複を避けたい場合は、この方法を使用して、以前の重複を残すか後の重複を残すかに応じて、重複を取り除くことができます。)