Array-Filter in Python?

84

Zum Beispiel habe ich zwei Listen

 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 

Gibt es eine integrierte Funktion in Python, um dies zu tun?

kn3l
quelle

Antworten:

118

Wenn die Reihenfolge nicht wichtig ist, sollten Sie verwenden set.difference. Wenn Sie jedoch die Reihenfolge beibehalten möchten, ist ein einfaches Listenverständnis alles, was Sie brauchen.

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

BEARBEITEN : Wie Delnan sagt, wird die Leistung erheblich verbessert, wenn subset_of_Aes sich um eine tatsächliche handelt set, da die Überprüfung der Mitgliedschaft in a setO (1) im Vergleich zu O (n) für eine Liste ist.

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
quelle
14
Und dies kann erheblich verbessert werden, indem subset_of_Aein Real erstellt wird set, der einen O(1)Mitgliedschaftstest gibt (anstatt O(n)wie bei Listen).
55

Ja, die filterFunktion:

filter(lambda x: x not in subset_of_A, A)
Carlpett
quelle
8
Beachten Sie, dass in Python 2 filterdie Liste selbst zurückgegeben wird, während in Python 3 ein Iterator zurückgegeben wird.
Modulitos
13
@modulitoslist(filter(...))
Paweł Kaczorowski
7

Nein, es gibt keine eingebaute Funktion in Python, um dies zu tun, weil einfach:

set(A)- set(subset_of_A)

wird Ihnen die Antwort geben.

Essen
quelle
1
Während dies für sein Beispiel funktioniert, kann es Probleme geben, wenn Elemente in der Liste A wiederholt werden.
Alok Mysore
6

set(A)-set(subset_of_A)gibt Ihnen die beabsichtigte Ergebnismenge, behält jedoch nicht die ursprüngliche Reihenfolge bei. Folgendes ist umtragserhaltend:

[a for a in A if not a in subset_of_A]
Alexander Gessler
quelle
5

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

NPE
quelle
3

Wie wäre es mit

set(A).difference(subset_of_A)
JoshAdel
quelle
3

Dies wurde erst vor ein paar Tagen gefragt (aber ich kann es nicht finden):

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

setJe nach Kontext ist es möglicherweise besser, s von Anfang an zu verwenden. Dann können Sie Set-Operationen verwenden, wie andere Antworten zeigen.

Das Konvertieren von Listen in Mengen und zurück nur für diese Vorgänge ist jedoch langsamer als das Listenverständnis.

Felix Kling
quelle
2

Verwenden Sie den SetTyp:

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