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?

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]

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)

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.


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]

5

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



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.


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

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

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])
>>> 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.