Die Python-Funktion filter() erzeugt einen lazy Iterator, der ein Iterable durchläuft und nur die Elemente weitergibt, für die eine Filter-Funktion True zurückgibt. filter() ist eines der drei klassischen funktionalen Werkzeuge — neben map() und reduce() — und für viele Filter-Aufgaben oft kompakter als eine List-Comprehension, aber nicht immer lesbarer.
Einleitung
filter() gehört zu den drei klassischen funktionalen Werkzeugen Pythons — neben map() und reduce(). Es nimmt zwei Argumente: eine Filter-Funktion (Prädikat) und ein Iterable. Das Ergebnis ist ein neuer Iterator, der genau die Elemente liefert, für die das Prädikat einen wahrheitsähnlichen (truthy) Wert zurückgibt.
Wird None als Funktion übergeben, fungiert filter() als reiner Truthy-Filter: Alle Elemente, die als wahr gelten (also nicht 0, None, "", [], ...), werden behalten.
filter() ist lazy: Die Filter-Funktion wird erst dann auf ein Element angewendet, wenn der Iterator das nächste Element liefern soll. Das macht filter() sehr speicher-effizient — auch bei Millionen-Elementen oder unendlichen Generatoren.
Syntax
filter(function, iterable)function Eine Funktion, die ein Element nimmt und True (Element behalten) oder False (Element überspringen) zurückgibt. Wird None übergeben, werden alle truthy Elemente behalten.
iterable Beliebige Iterable: Liste, Generator, Datei, Set usw.
Rückgabewert
Ein filter-Iterator. Lazy — wertet die Funktion erst aus, wenn das nächste Element abgefragt wird. Mit list() materialisierbar.
Beispiele
Mit benannter Funktion
def is_even(n):
return n % 2 == 0
numbers = [1, 2, 3, 4, 5, 6]
even = list(filter(is_even, numbers))
print(even)[2, 4, 6]Mit Lambda
words = ["Hallo", "", "Welt", None, "Python", ""]
nicht_leer = list(filter(lambda x: x, words))
print(nicht_leer)['Hallo', 'Welt', 'Python']Mit None — alle truthy Elemente
values = [0, 1, "", "Text", None, [], [1, 2]]
truthy = list(filter(None, values))
print(truthy)[1, 'Text', [1, 2]]filter vs. List-Comprehension
# filter:
even = list(filter(lambda n: n % 2 == 0, range(10)))
# List-Comprehension (oft lesbarer):
even = [n for n in range(10) if n % 2 == 0]Praktische Beispiele
Gültige E-Mails aus einer Liste herausfischen
import re
input_value = ["info@mibeon.com", "unvalid", "michael@example.org", "@noch-falsch"]
pattern = re.compile(r"^[\w.+-]+@[\w-]+\.[\w.-]+$")
valid = list(filter(pattern.match, input_value))
print(valid)['info@mibeon.com', 'michael@example.org']Datensätze nach Bedingung filtern
users = [
{"name": "Alice", "alter": 17, "aktiv": True},
{"name": "Bob", "alter": 24, "aktiv": False},
{"name": "Cleo", "alter": 31, "aktiv": True},
]
erwachsen_aktiv = list(filter(
lambda u: u["alter"] >= 18 and u["aktiv"],
users,
))
for u in erwachsen_aktiv:
print(u["name"])Cleofilter() + map() kombinieren
numbers = range(1, 11)
# Quadrate aller geraden Zahlen
result = list(map(lambda n: n * n, filter(lambda n: n % 2 == 0, numbers)))
print(result)[4, 16, 36, 64, 100]Praktische Hinweise
- Lazy: Bei großen Iterables Speicher-effizient, weil Elemente nur on-demand erzeugt werden.
- Mit
Nonefiltertfilter()alle Falsy-Werte (0,"",None,[], ...). - List-Comprehensions sind oft lesbarer und werden in der Python-Community häufig bevorzugt.
- Kombination mit
map()ist klassisch funktional:list(map(func, filter(predicate, data))).