Python - unbekannte Funktionen: List Comprehension

  Ralf Hersel   Lesezeit: 3 Minuten  🗪 5 Kommentare

Bietet eine kürzere Syntax, um eine neue Liste auf der Grundlage der Werte einer bestehenden Liste zu erstellen.

python - unbekannte funktionen: list comprehension

Nach den Funktionen zip, map, lambda, und filter, geht es jetzt um die List Comprehension. Ob dieses Konstrukt zu den "unbekannten Funktionen" zählt, kann man unterschiedlich beurteilen. Mir ist jedoch aufgefallen, dass Einsteiger:innen oft ungläubig schauen, wenn sie diesen Befehl zum ersten Mal sehen. Selbst ich muss immer wieder Beispiele zurate ziehen, wenn ich gelegentlich eine List Comprehension schreibe. Für diesen Begriff gibt es keine gute Übersetzung; "Listenverständnis" klingt seltsam.

Die Syntax einer List Comprehension (LC) lautet:

Neue_Liste = [Ausdruck for Element in Liste if Bedingung == True]

Das Ergebnis des Befehls ist eine neue Liste. Um diese zu erstellen, läuft man durch eine bestehende Liste (for Element in Liste) und wendet auf jedes Element einen Ausdruck an, falls die Bedingung zutrifft. Die Bedingung kann weggelassen werden. Ich beginne mit einem einfachen Beispiel:

Liste = [1,2,3,4,5]
Neue_Liste = [Element**2 for Element in Liste]
[1, 4, 9, 16, 25]

Zuerst wird eine Liste definiert. In der LC wird nun jedes Element der Liste quadriert. Als Ergebnis gibt es eine neue Liste mit den Quadratzahlen der ersten Liste. Nun ein Beispiel mit einer Bedingung:

Fruechte = ['Banane', 'Orange', 'Kirsche', 'Himbeere']
A_Fruechte = [Frucht for Frucht in Fruechte if 'a' in Frucht]
['Banane', 'Orange']

Die neue Liste A_Fruechte enthält nach der LC nur Früchte, die den Buchstaben 'a' beinhalten. Das wird durch die Bedingung if 'a' in Frucht erreicht. Auch mit mehreren Listen kann die LC umgehen. Im nächsten Beispiel sollen die Elemente der beiden Listen a und b addiert werden:

a, b  = [1,2,3], [10,20,30]
Addition = [x+y for x in a for y in b]
[11, 21, 31, 12, 22, 32, 13, 23, 33]

Dieses Konstrukt entspricht einer geschachtelten For-Schleife. Eine LC kann auch mit mehrdimensionalen Listen umgeben:

Namen = [['Donald','Duck'],['Mickey','Maus']]
Vornamen = [Name[0] for Name in Namen]
['Donald', 'Mickey']

Hier wird die erste Dimension aus der mehrdimensionalen Liste extrahiert.

Wie man sieht, ist die List Comprehension ein leistungsstarkes Konstrukt, welches viel Funktionalität mit wenig Code bietet. Dies geht manchmal zulasten der Übersichtlichkeit, wenn zu viel in die LC gepackt wird. Hier ist ein Beispiel einer verwirrenden LC (es ist eine Zeile Code):

info = [[event['start_time'], 'Offsite' if event['rooms'][0]['name'] ==
'Offsite' else 'In-House', event['account']['name'], event['guest_count']]
for event in events['results']]

Hier versteht man nicht auf den ersten Blick, was die LC macht.

Tags

Python, Funktion, List Comprehension

kaligule
Geschrieben von kaligule am 29. Juni 2023 um 15:00

List comprehensions ersetzen oft map, filter und lambdas. Im Idealfall alles aufeinmal. Man darf nur nicht den Fehler begehen, alles in eine Zeile quetschen zu wollen.

Robert
Geschrieben von Robert am 29. Juni 2023 um 15:37

Und etwas, das ziemlich genauso funktioniert, habe ich auch erst ziemlich spät irgendwo gesehen: die Dictionary Comprehension, z.B.

d = {1:3, 2:6, 4:5}
{k: v for k, v in d.items() if k*3 == v}
Ralf Hersel
Geschrieben von Ralf Hersel am 29. Juni 2023 um 19:07

Sehr schön. Das kannte ich auch noch nicht. Wenn Du eine kurze Erklärung dazu in den Kommentar schreibst, wäre das sicher hilfreich für die Leser.

Robert
Geschrieben von Robert am 1. Juli 2023 um 00:23

Eigentlich geht es genauso wie die List Comprehension. Der Teil nach dem for ist ganz genauso, nur dass ich hier über Tupel von Schlüsseln kund Werten v iterere – das könnte aber auch eine Iteration über eine einfache Liste oder ähnliches sein. Das Besondere an der Dictionary Comprehension ist der Teil

{f(x): g(x) for x in …}

Hierbei ist f die Funktion, die die Schlüssel und g die, die die Werte des Wörterbuchs erzeugt.

klt
Geschrieben von klt am 30. Juni 2023 um 07:38

Ich vermute mal der Begriff "Comprehension" wurde aus der Mengenlehre übernommen. Das Comprehension Axiom wird im Deutschen häufig mit Aussonderung übersetzt.

Allerdings verknüpft Pythons Comprehension zwei Axiome: Comprehension und Replacement.