List Comprehension
List Comprehensions oder Listen-Abstraktionen[1] sind syntaktische Gefüge, die beschreiben, wie vorhandene Listen oder andere iterierbare Objekte verarbeitet werden, um aus ihnen neue Listen zu erstellen.
Sie werden in einigen Programmiersprachen wie z. B. Python, Haskell oder Common Lisp unterstützt und werden in Analogie zur beschreibenden Mengenschreibweise (engl. set-builder notation) notiert.
Ähnlichkeiten zur Mengenschreibweise
Die Menge der Quadratzahlen mit geraden Basen zwischen 10 und 20 lässt sich mit der beschreibenden Mengenschreibweise folgendermaßen notieren
.
In Haskell sieht eine List Comprehension, die dieselben Bedingungen erfüllt, folgendermaßen aus:
m = [x^2 | x <-[10..20], mod x 2 == 0]
Es ist zu beachten, dass mit der Angabe [10..20] implizit angegeben wird, dass eine Teilmenge der natürlichen Zahlen in der Eingabemenge ist.
In Python benutzt man folgende Schreibweise
m = [x**2 for x in range(10,21) if x%2 == 0]
Hier gilt fast dasselbe wie bei Haskell, nur dass bei dem Initialisieren der Range-Klasse für die obere Grenze noch 1 dazuaddiert werden muss.[2]
Alle drei Notationen lassen sich in vier Teile aufgliedern:
- Ausgabeausdruck (output expression): x^2
- Variable: x
- Eingabemenge (input set): die natürlichen Zahlen N
- Prädikat/Eigenschaft (predicate): die geraden Zahlen der Eingabemenge
Mehrdimensionale Felder
Manche Programmiersprachen wie Python oder Haskell haben keine native Unterstützung für mehrdimensionale Felder. In einem solchen Fall kann man mithilfe von List Comprehensions eine Ersatzkonstruktion schaffen.
In diesem Beispiel wird eine leere 5x5-Matrixersatzkonstruktion mit Listen erstellt:
m = [[None for zeile in range(5)] for spaltenNr in range(5)] # Erstellung
m[1][4] = 4 # Element in Zeile 2, Spalte 5 mit dem Wert 4 belegen
Der Ausgabeausdruck ist ebenfalls eine List Comprehension. Es handelt sich um also eine Verschachtelung.
Die innere List Comprehension erzeugt eine Zeile aus fünf Elementen mit dem Nullwert None
und die äußere List Comprehension sorgt dann dafür, dass eine Liste mit fünf Zeilen bedingungslos (ohne Prädikat) erstellt wird. Der Zugriff funktioniert dann wie bei einem gewöhnlichen mehrdimensionalen Feld.