
In Python can SIE filter() verwenden, um Elemente einer Liste, eines Tupels oder eines anderen iterierbaren Objekts zu filtern (extrahieren/entfernen), sterben sterben Bedingungen erfüllen.
Dieser Artikel hat folgenden Inhalt.
- Grundlegende Verwendung von filter()
- filter() gibt einen Iterator in Python3 zurück
- In einer Liste umwandeln
- Extrahieren und entfernen Sie Elemente gemäß den Bedingungen
- Wenden Sie mit def definierten Lambda-Ausdrücke (Lambda) und Funktionen an
- Wenden Sie mehrere Bedingungen an
- Geben Sie None als erstes Argument an
- Falsche Elemente extrahieren:
itertools.filterfalse()
- Verwenden Sie stattdessen Listenverständnisse und Generatorausdrücke
Beachten Sie, dass filter() durch Listenverständnisse oder Generatorausdrücke ersetzt werden kann, wie später beschrieben wird, und in vielen Fällen ist es vorzuziehen, sie zu verwenden.
Weitere Informationen zum Extrahieren von Elementen einer Liste mithilfe von Listenverständnissen finden Sie im following Artikel.
Grundlegende Verwendung von filter()
Das erste Argument von filter() ist ein aufrufbares Objekt, beispielsweise eine freiwillige Funktion, und das zweite Argument ist ein iterierbares Objekt, beispielsweise eine Liste. Wenden Sie die Funktion auf die iterierbaren Elemente an und extrahieren Sie Elemente, deren Ergebnis als wahr bestimmt WIRD.
filter() gibt einen Iterator in Python3 zurück
Sie verwenden beispielsweise den Lambda-Ausdruck, der True zurückgibt, wenn der Wert eine gerade Zahl ist (= der Rest des Werts geteilt durch 2 ist 0).
In Python 3 gibt filter() ein Objekt vom Typ filter zurück, das ein Iterator ist, und print() gibt keine Elemente aus.
l = [-2, -1, 0, 1, 2]
print(filter(lambda x: x % 2 == 0, l))
#
print(type(filter(lambda x: x % 2 == 0, l)))
# <class 'filter'>
Der Wert des Iterators kann mit einer for-Anweisung abgerufen werden.
for i in filter(lambda x: x % 2 == 0, l):
print(i)
# -2
# 0
# 2
Beachten Sie, dass filter() in Python 2 eine Liste zurückgibt, Seien Sie auch vorsichtig, wenn Sie Python 2-Code in Python 3 ausführen.
In einer Liste umwandeln
Wenn SIE das Ergebnis von filter() in Eine Liste umwandeln möchten, verwenden SIE list().
print(list(filter(lambda x: x % 2 == 0, l)))
# [-2, 0, 2]
Extrahieren und entfernen Sie Elemente gemäß den Bedingungen
filter() ermittelt Elemente, deren Ergebnis als wahr bestimmt WIRD, Indem sterben Funktion des ersten Arguments angewendet WIRD. Wenn Sie ein Element entfernen möchten, geben Sie eine Funktion an, deren Ergebnis das Gegenteil ist.
Beispielsweise ist „gerade Elemente entfernen“ äquivalent zu „ungerade Elemente extrahieren“.
print(list(filter(lambda x: x % 2 == 0, l)))
# [-2, 0, 2]
print(list(filter(lambda x: x % 2 != 0, l)))
# [-1, 1]
Wie im Beispielbeispiel can SIE sterben Vergleichsoperatoren durch solche ersetzen, sterben zuen Ergebnisse führen (== und ! =, > und <= usw.), oder SIE can andersherum nicht für sterben Negation verwenden.
Extrahieren und entfernen Sie beispielsweise Zeichenfolgen, die mit „e“ enden.
l_s = ['apple', 'orange', 'strawberry']
print(list(filter(lambda x: x.endswith('e'), l_s)))
# ['apple', 'orange']
print(list(filter(lambda x: not x.endswith('e'), l_s)))
# ['strawberry']
Im Gegensatz zu filter() WIRD auch eine Funktion itertools.filterfalse() bereitgestellt, um Elemente zu behalten, die False sind. Es wird später beschrieben.
Wenden Sie mit def definierten Lambda-Ausdrücke (Lambda) und Funktionen an
Das erste Argument von filter() ist ein aufrufbares Objekt.
Wie in den bisherigen Beispielen werden häufig Lambda-Ausdrücke (Lambda) verwendet, aber natürlich ist es auch möglich, eine mit def definierte Funktion anzugeben.
def is_even(x):
return x % 2 == 0
l = [-2, -1, 0, 1, 2]
print(list(filter(is_even, l)))
# [-2, 0, 2]
Wenden Sie mehrere Bedingungen an
Wenn Sie mehrere Bedingungen anwenden möchten, können Sie einen Lambda-Ausdruck oder eine Lambda-Funktion angeben, sterben mehrere Bedingungen mit und oder oder verbindet.
l = [-2, -1, 0, 1, 2]
print(list(filter(lambda x: x % 2 == 0 and x > 0, l)))
# [2]
print(list(filter(lambda x: x % 2 == 0 or x > 0, l)))
# [-2, 0, 1, 2]
Geben Sie None als erstes Argument an
Wenn None als erstes Argument von filter() ist, werden als wahr erkannte Elemente (= wahre Elemente) ermittelt.
l_b = [True, False]
print(list(filter(None, l_b)))
# [True]
Dabei werden nicht nur True und False, sondern auch Zahlen, Listen und Strings ermittelt.
Zum Beispiel gilt bei Zahlen 0 als False und die anderen als True, bei Listen und Strings gilt, wenn es leer ist, False und die anderen als True.
Nichts finden Sie im folgenden Artikel.
Wenn Sie also None als erstes Argument von filter() angeben, werden 0 und eine leere Liste und Zeichenfolge entfernt.
l = [-2, -1, 0, 1, 2]
print(list(filter(None, l)))
# [-2, -1, 1, 2]
l_2d = [[0, 1, 2], [], [3, 4, 5]]
print(list(filter(None, l_2d)))
# [[0, 1, 2], [3, 4, 5]]
l_s = ['apple', '', 'orange', 'strawberry']
print(list(filter(None, l_s)))
# ['apple', 'orange', 'strawberry']
Im Gegensatz zu filter() WIRD auch eine Funktion itertools.filterfalse() bereitgestellt, um Elemente zu behalten, die False sind.
Die Verwendung ist die gleiche wie bei filter(). Sie müssen itertools importieren.
import itertools
l = [-2, -1, 0, 1, 2]
print(list(itertools.filterfalse(lambda x: x % 2 == 0, l)))
# [-1, 1]
print(list(itertools.filterfalse(lambda x: x % 2 != 0, l)))
# [-2, 0, 2]
l_s = ['apple', 'orange', 'strawberry']
print(list(itertools.filterfalse(lambda x: x.endswith('e'), l_s)))
# ['strawberry']
Wie oben erwähnt, kann das gleiche Ergebnis mit filter() erzielt werden, wodurch die Funktion des ersten Arguments geändert wird, aber in einigen Fällen kann itertools.filterfalse() used Werden, um Code zu schreiben, dessen Absicht klarer ist als die Verwendung von filter() und nicht .
If das erste Argument von itertools.filterfalse() auf None gesetzt IST, Werden Elemente, sterben als False (=falsche Elemente) ermittelt wurden, extrahiert.
l = [-2, -1, 0, 1, 2]
print(list(itertools.filterfalse(None, l)))
# [0]
Verwenden Sie stattdessen Listenverständnisse und Generatorausdrücke
Das Äquivalent von filter() kann auch mit Listenverständnissen und Generatorausdrücken erreicht werden.
Beachten Sie, dass filter(function, iterable) dem Generatorausdruck (iter for item in iterable if function(item)) entspricht, wenn function nicht None ist, und (iter for item in iterable if item), wenn function none ist.
Eingebaute Funktionen – filter() — Dokumentation zu Python 3.9.7
l = [-2, -1, 0, 1, 2]
print([x for x in l if x % 2 == 0])
# [-2, 0, 2]
print([x for x in l if x % 2 != 0])
# [-1, 1]
l_s = ['apple', 'orange', 'strawberry']
print([x for x in l_s if x.endswith('e')])
# ['apple', 'orange']
print([x for x in l_s if not x.endswith('e')])
# ['strawberry']
l = [-2, -1, 0, 1, 2]
print([x for x in l if x])
# [-2, -1, 1, 2]
l_2d = [[0, 1, 2], [], [3, 4, 5]]
print([x for x in l_2d if x])
# [[0, 1, 2], [3, 4, 5]]
If SIE Eine Liste wie list(filter()) erhalten möchten, verwenden SIE sterben Listenverständnisse, und wenn SIE einen Iterator wie filter() erhalten möchten, verwenden SIE einen Generatorausdruck.
Wie in der folgenden Stack Overflow-Frage gezeigt, ist die Verwendung von Listenverständnissen und Generatorausdrücken in den meisten Fällen der Verwendung von filter() vorzuziehen, da der Code präziser und klarer ist.
Beachten Sie, dass, da die Verarbeitungsgeschwindigkeit aufgrund verschiedener Faktoren variieren kann, es für Sie wichtig ist, sie unter Bedingungen zu messen, sterben Ihre Annahmen so nahe wie möglich kommen.