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.
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.
Und etwas, das ziemlich genauso funktioniert, habe ich auch erst ziemlich spät irgendwo gesehen: die Dictionary Comprehension, z.B.
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.
Eigentlich geht es genauso wie die List Comprehension. Der Teil nach dem
for
ist ganz genauso, nur dass ich hier über Tupel von Schlüsselnk
und Wertenv
iterere – das könnte aber auch eine Iteration über eine einfache Liste oder ähnliches sein. Das Besondere an der Dictionary Comprehension ist der TeilHierbei ist
f
die Funktion, die die Schlüssel undg
die, die die Werte des Wörterbuchs erzeugt.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.