Pythonの配列フィルター?


84

たとえば、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の組み込み関数はありますか?

回答:


118

順序が重要でない場合は、を使用する必要がありますset.difference。ただし、順序を維持したい場合は、単純なリスト内包表記で十分です。

result = [a for a in A if a not in subset_of_A]

編集: delnanが言うようsubset_of_Aに、が実際の場合、リストのO(n)と比較してsetaのメンバーシップのチェック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]

14
そして、これは、(リストの場合のようにではなく)メンバーシップテストをsubset_of_A行う実際のを作成することによって大幅に改善できます。setO(1)O(n)


7

いいえ、これを行うためのPythonの組み込み関数はありません。理由は次のとおりです。

set(A)- set(subset_of_A)

あなたに答えを提供します。


1
彼の例については、この作品ながら要素がリストAに繰り返された場合、問題があるかもしれません
Alokマイソール

6

set(A)-set(subset_of_A)意図した結果セットが得られますが、元の順序は保持されません。以下は順序の保持です。

[a for a in A if not a in subset_of_A]

5

tuple(set([6, 7, 8, 9, 10, 11, 12]).difference([6, 9, 12]))



3

これは数日前に尋ねられたばかりです(しかし私はそれを見つけることができません):

>>> 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を使用する方がよい場合があります。次に、他の回答が示すように集合演算を使用できます。

ただし、リストをセットに変換し、これらの操作に対してのみ元に戻すには、リストの理解よりも時間がかかります。


2

次の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

1
>>> a = set([6, 7, 8, 9, 10, 11, 12])
>>> sub_a = set([6, 9, 12])
>>> a - sub_a
set([8, 10, 11, 7])

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.