web-dev-qa-db-ja.com

Pythonの配列フィルター?

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

59
kn3l

順序が重要でない場合は、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]
87
Chinmay Kanchi

はい、 filter 関数:

filter(lambda x: x not in subset_of_A, A)
43
carlpett

いいえ、これを行うためのpythonには組み込み関数はありません。

set(A)- set(subset_of_A)

答えを提供します。

7
eat

set(A)-set(subset_of_A)は、意図した結果セットを提供しますが、元の順序を保持しません。以下は順序を維持します。

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

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

5
NPE

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

>>> 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]

コンテキストに応じて、最初からsetsを使用する方が適切な場合があります。それから set operations を他の答えが示すように使用できます。

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

3
Felix Kling

どう?

set(A).difference(subset_of_A)
2
JoshAdel

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
2
Platinum Azure
>>> a = set([6, 7, 8, 9, 10, 11, 12])
>>> sub_a = set([6, 9, 12])
>>> a - sub_a
set([8, 10, 11, 7])
1
Jake
>>> 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])
>>> 
1
Andreas Jung