たとえば、2つのリストがあります
A = [6, 7, 8, 9, 10, 11, 12]
subset_of_A = [6, 9, 12]; # the subset of A
the result should be [7, 8, 10, 11]; the remaining elements
これを行うためのPythonの組み込み関数はありますか?
回答:
順序が重要でない場合は、を使用する必要がありますset.difference
。ただし、順序を維持したい場合は、単純なリスト内包表記で十分です。
result = [a for a in A if a not in subset_of_A]
編集: delnanが言うようsubset_of_A
に、が実際の場合、リストのO(n)と比較してset
aのメンバーシップのチェックset
はO(1)であるため、パフォーマンスは大幅に向上します。
A = [6, 7, 8, 9, 10, 11, 12]
subset_of_A = set([6, 9, 12]) # the subset of A
result = [a for a in A if a not in subset_of_A]
はい、filter
機能:
filter(lambda x: x not in subset_of_A, A)
filter
リスト自体を返しますが、Python3ではイテレータを返すことに注意してください。
list(filter(...))
set(A)-set(subset_of_A)
意図した結果セットが得られますが、元の順序は保持されません。以下は順序の保持です。
[a for a in A if not a in subset_of_A]
これは数日前に尋ねられたばかりです(しかし私はそれを見つけることができません):
>>> A = [6, 7, 8, 9, 10, 11, 12]
>>> subset_of_A = set([6, 9, 12])
>>> [i for i in A if i not in subset_of_A]
[7, 8, 10, 11]
set
コンテキストによっては、最初からsを使用する方がよい場合があります。次に、他の回答が示すように集合演算を使用できます。
ただし、リストをセットに変換し、これらの操作に対してのみ元に戻すには、リストの理解よりも時間がかかります。
>>> A = [6, 7, 8, 9, 10, 11, 12]
>>> subset_of_A = [6, 9, 12];
>>> set(A) - set(subset_of_A)
set([8, 10, 11, 7])
>>>
subset_of_A
行う実際のを作成することによって大幅に改善できます。set
O(1)
O(n)