たとえば、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
が実際のset
である場合、set
のメンバーシップのチェックはO(1)リストのO(n)と比較。
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)
いいえ、これを行うためのpythonには組み込み関数はありません。
set(A)- set(subset_of_A)
答えを提供します。
set(A)-set(subset_of_A)
は、意図した結果セットを提供しますが、元の順序を保持しません。以下は順序を維持します。
[a for a in A if not a in subset_of_A]
Tuple(set([6, 7, 8, 9, 10, 11, 12]).difference([6, 9, 12]))
これは数日前に尋ねられました(しかし、私はそれを見つけることができません):
>>> 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を使用する方が適切な場合があります。それから set operations を他の答えが示すように使用できます。
ただし、リストをセットに変換し、これらの操作のみを元に戻すことは、リストの理解よりも時間がかかります。
どう?
set(A).difference(subset_of_A)
Set
タイプを使用します。
A_set = Set([6,7,8,9,10,11,12])
subset_of_A_set = Set([6,9,12])
result = A_set - subset_of_A_set
>>> a = set([6, 7, 8, 9, 10, 11, 12])
>>> sub_a = set([6, 9, 12])
>>> a - sub_a
set([8, 10, 11, 7])
>>> 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])
>>>