Filtern einer Liste in Python

In diesem Artikel werden wir vier verschiedene Methoden zur Listenfilterung in Python untersuchen: Iteration, die filter-Funktion, List Comprehension und die itertools-Bibliothek. Jede Methode hat ihre eigenen Stärken und Schwächen, wodurch sie für unterschiedliche Szenarien und Anwendungsfälle geeignet sind.

Methode 1: Verwendung einer Schleife

Man kann eine Schleife verwenden, um jedes Element in der Liste zu überprüfen und nur diejenigen Elemente beizubehalten, die bestimmte Bedingungen erfüllen. Hier ist ein Beispiel:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = []
for number in numbers:
    if number % 2 == 0:
        even_numbers.append(number)
print(even_numbers)

In diesem Beispiel wird eine leere Liste even_numbers erstellt. Dann wird jedes Element in der Liste numbers überprüft und nur die geraden Zahlen zur Liste even_numbers hinzugefügt. Am Ende wird die Liste even_numbers ausgegeben.

Methode 2: Verwendung der filter()-Funktion

Die filter()-Funktion ermöglicht es, eine Funktion auf jedes Element in der Liste anzuwenden und nur diejenigen Elemente beizubehalten, für die die Funktion True zurückgibt. Hier ist ein Beispiel:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)

In diesem Beispiel wird die filter()-Funktion verwendet, um die lambda-Funktion lambda x: x % 2 == 0 auf jedes Element in der Liste numbers anzuwenden. Die lambda-Funktion überprüft, ob ein Element gerade ist, und gibt True oder False zurück. Nur die Elemente, für die die Funktion True zurückgibt, werden in die Liste even_numbers aufgenommen.

Methode 3: Verwendung einer List Comprehension

List Comprehension ist eine besondere Syntax in Python, mit der man aus vorhandenen Listen neue Listen erstellen kann, indem man Operationen an jedem Element ausführt.

List Comprehensions bietet eine kompakte Möglichkeit, eine Liste zu filtern:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = [number for number in numbers if number % 2 == 0]
print(even_numbers)

In diesem Beispiel wird "List Comprehension" verwendet, um jedes Element in der Liste numbers zu überprüfen und nur die geraden Zahlen zur Liste even_numbers hinzuzufügen.

Methode 4: Verwendung der itertools-Modul

Das itertools-Modul bietet verschiedene Funktionen zum Filtern von Listen. Hier ist ein Beispiel:

import itertools

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = list(itertools.filterfalse(lambda x: x % 2 != 0, numbers))
print(even_numbers)

In diesem Beispiel wird die filterfalse()-Funktion aus dem itertools-Modul verwendet, um die lambda-Funktion lambda x: x % 2 != 0 auf jedes Element in der Liste numbers anzuwenden. Die lambda-Funktion überprüft, ob ein Element ungerade ist, und gibt True oder False zurück. Nur die Elemente, für die die Funktion False zurückgibt, werden in die Liste even_numbers aufgenommen.

Kleiner Performance-Test

import timeit

data = list(range(10000))

# Iteration
def filter_iteration():
    filtered_data = []
    for num in data:
        if num % 2 == 0:
            filtered_data.append(num)
    return filtered_data

# Filter Funktion
def filter_function():
    return list(filter(lambda x: x % 2 == 0, data))

# List Comprehension
def filter_list_comprehension():
    return [num for num in data if num % 2 == 0]

# Itertools
import itertools
def filter_itertools():
    return list(itertools.filterfalse(lambda x: x % 2 != 0, data))

# Ergebnis
tests_num = 10000
print("Iteration:", timeit.timeit(filter_iteration, number=tests_num)) # Iteration: 3.0866809168364853
print("Filter Funktion:", timeit.timeit(filter_function, number=tests_num)) # Filter Funktion: 3.9156579161062837
print("List Comprehension:", timeit.timeit(filter_list_comprehension, number=tests_num)) # List Comprehension: 2.404051834018901
print("Itertools:", timeit.timeit(filter_itertools, number=tests_num)) # Itertools: 3.8956236669328064

"List Comprehension" sind innerhalb des Python-Interpreters in C implementiert. Damit laufen sie schneller als Python-Schleifen und Funktionsaufrufe. Obwohl mit "List Comprehensions" eine neue Liste zurückgeben wird, ist es speichereffizient und die Allokation des Speichers spielt keine große Rolle bei der Ausführung.

"List Comprehension" sind generell die beste Wahl für verschiedene Filteraufgaben aufgrund der Kombination aus Leistung und immer nocht guter Code-Lesbarkeit. Für komplexere Filterlogik oder wenn die Lesbarkeit Priorität hat (und die Leistung weniger kritisch ist), könnte ein Schleifen- oder Filter-Funktion-Mangel mehr geeignet sein.