фильтр массива в Python?

87

Например, у меня есть два списка

 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 

Is there a built-in function in python to do this?

kn3l
источник

Ответы:

122

If the order is not important, you should use set.difference. However, if you want to retain order, a simple list comprehension is all it takes.

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

EDIT: As delnan says, performance will be substantially improved if subset_of_A is an actual set, since checking for membership in a set is O(1) as compared to O(n) for a list.

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]
Chinmay Kanchi
источник
14
And this can be improved vastly by making subset_of_A a real set, which gives O(1) membership test (instead of O(n) as with lists).
56

Yes, the filter function:

filter(lambda x: x not in subset_of_A, A)
carlpett
источник
8
Note that in Python 2, filter returns the list itself, while in Python 3, it returns an iterator.
modulitos
16
@modulitos list(filter(...))
Paweł Kaczorowski
7

No, there is no build in function in python to do this, because simply:

set(A)- set(subset_of_A)

will provide you the answer.

eat
источник
1
While this works for his example, there may be problems if elements are repeated in the list A.
Alok Mysore
6

set(A)-set(subset_of_A) gives your the intended result set, but it won't retain the original order. The following is order preserving:

[a for a in A if not a in subset_of_A]
Alexander Gessler
источник
5

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

NPE
источник
3

This was just asked a couple of days ago (but I cannot find it):

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

It might be better to use sets from the beginning, depending on the context. Then you can use set operations like other answers show.

However, converting lists to sets and back only for these operations is slower than list comprehension.

Felix Kling
источник
2

Use the Set type:

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
Platinum Azure
источник
1
>>> a = set([6, 7, 8, 9, 10, 11, 12])
>>> sub_a = set([6, 9, 12])
>>> a - sub_a
set([8, 10, 11, 7])
Jake
источник
1
>>> 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])
>>> 
Andreas Jung
источник