List Comprehension in Python

In einem älteren Artikel wurde erklärt, was eine Liste (in Python) ist. Dabei wurde auf die Iteration eingegangen, also die Möglichkeit, eine Liste zu durchlaufen. In folgendem Beispiel wird dafür eine For-Schleife verwendet. Im Ergebnis wird so jedes Element der Liste numbers mithilfe der Funktion print() ausgegeben:

numbers: list = [27, 33, 12, 102, 50, 49, 72, 4]

for i in numbers:
    print(i)

Anstelle einer For-Schleife könnte man auch eine List Comprehension verwenden. Der Code würde dann folgendermaßen aussehen:

numbers: list = [27, 33, 12, 102, 50, 49, 72, 4]

[print(i) for i in numbers]

Zugegebenermaßen macht die Verwendung einer List Comprehension für diesen Anwendungsfall nicht viel Sinn. Vielmehr kommt eine Comprehension dann in Betracht, wenn die Elemente einer Liste verändert werden sollen und als Ergebnis eine neue Liste erstellt wird.

Betrachten wir dazu folgendes Beispiel, bei der wir wieder die Liste numbers verwenden. Diesmal soll jedes Element mit 10 addiert werden. Als Ergebnis wollen wir eine neue Liste mit dem Namen new_numbers_list erhalten.

numbers: list = [27, 33, 12, 102, 50, 49, 72, 4]

new_numbers_list: list = [i + 10 for i in numbers]

print(new_numbers_list)
# -> [37, 43, 22, 112, 60, 59, 82, 14]

Für diese Aufgabe ist lediglich der Einzeiler

[i + 10 for i in numbers]

erforderlich.

Alternativ könnte die Funktion map() verwendet werden, die allerdings eine gewisse Komplexität mit sich bringt und so den Code schwer lesbar macht:

# Neue Liste mit map() erstellen
new_numbers_list: list = list(map(lambda i: i + 10, numbers))

Eine List Comprehension kann um eine Bedingung erweitert werden. Im folgenden Beispiel soll eine Addition mit 10 nur dann durchgeführt werden, wenn es sich bei dem Element um eine gerade Zahl handelt:

numbers: list = [27, 33, 12, 102, 50, 49, 72, 4]

new_numbers_list: list = [i + 10 for i in values if i % 2 == 0]

print(new_numbers_list)
# -> [22, 112, 60, 82, 14]

Wie ihr sehen könnt, lässt sich auch diese Aufgabe wieder in einer Zeile realisieren.

Als Fazit kann festgehalten werden, dass in bestimmten Fällen einer List Comprehension der Vorzug gegeben werden sollte, um den Code lesbarer zu machen.

Eine List Comprehension ist nicht immer sinnvoll

Eine Comprehension eignet sich aber nicht immer. Vielmehr ist es so, dass in manchen Fällen der Code auch schwer lesbar werden kann. Nachfolgendes Matrizenmultiplikation soll dies demonstrieren:

# Zwei Matrizen definieren
A = [[4, 6], [4, 2]]
B = [[7, 1], [3, 8]]

# Matrizenmultiplikation unter Verwendung einer List Comprehension
result = [[sum(a * b for a, b in zip(A_row, B_col)) for B_col in zip(*B)] for A_row in A]

# Ergebnis anzeigen
for row in result:
    print(row)

Wenn man mit Matrizen arbeitet, bietet es sich an, anstelle einer List Comprehension auf die Bibliothek numpy zurückzugreifen:

# numpy importieren
import numpy as np

# Zwei Matrizen definieren
A = [[4, 6], [4, 2]]
B = [[7, 1], [3, 8]]

Matrizenmultiplikation mit numpy
result = np.matmul(A, B)

# Ergebnis anzeigen
print(result)

Weiterführende Links

Zuletzt aktualisiert am 3. Oktober 2024