2

重複の可能性:
2 つのリストの共通要素の比較

私は2つのリストを持っています:

[Apples, Bananas, Pears]
[Kiwis, Bananas, Apples]

両方のリストが共有する要素のみを取得したいと思います。そのためには、Python にいくつかの組み込み関数が必要です。

結果:

[Apples, Bananas]
4

2 に答える 2

12
>>> 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'])
于 2012-08-30T15:03:09.417 に答える
10

元の回答:

[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 ソリューションの方が効率的であり、多くの場合、重複した要素が必要ないため、より優れています。ただし、秩序を維持したい場合は、これが最適です。(順序を維持して重複を避けたい場合は、この方法を使用して、以前の重複を残すか後の重複を残すかに応じて、重複を取り除くことができます。)

于 2012-08-30T15:01:54.713 に答える