List Comprehension
# List Comprehension

List Comprehensions oder Listen-Abstraktionen 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, Common Lisp oder Julia 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

$M=\{x^{2}\,|\,x\in \mathbb {N} ,10\leq x\leq 20,\,x{\bmod {2}}=0\}$.

In Haskell sieht eine List Comprehension, die dieselben Bedingungen erfüllt, folgendermaßen aus:

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

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.

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:

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.

