====== LU04c - List Comprehensions ======
List Comprehensions sind eine kompakte Schreibweise, um aus vorhandenen Daten neue Listen zu erzeugen. Man kann damit Elemente **transformieren** (z. B. quadrieren, in Grossbuchstaben umwandeln) und optional **filtern** – in einer einzigen, gut lesbaren Zeile. Die Schreibweise erinnert an mathematische Mengen-Schreibweise.
===== Hauptverwendungszweck von List Comprehensions =====
List Comprehensions werden in Python hauptsächlich für zwei Dinge verwendet:
* **Transformation**: Jedes Element eines Iterables wird in eine neue Form gebracht (z. B. ''x'' → ''%%x**2%%'' oder ''"audi"'' → ''"AUDI"'')
* **Filterung (optional)**: Es werden nur diejenigen Elemente übernommen, für die eine Bedingung erfüllt ist.
Typisch ist eine Kombination aus beidem:
> „Nimm alle Elemente aus einer bestehenden Datenquelle, filtere sie nach einer Bedingung und wandle sie in eine neue Form um.“
===== Die Syntax =====
Die allgemeine Form einer List Comprehension ist:
newlist = [expression for item in iterable if condition]
* **expression**: Der Ausdruck, dessen Wert in die neue Liste aufgenommen wird (oft eine Transformation von ''item'').
* **item**: Der Name für das aktuelle Element in der Schleife.
* **iterable**: Die Datenquelle, über die iteriert wird (z. B. Liste, Tupel, range, String, …).
* **condition** (optional): Eine Bedingung, die ''True'' oder ''False'' ergibt. Nur wenn sie `True` ist, wird ''expression'' in die neue Liste aufgenommen.
Ohne Filter-Bedingung sieht die einfachste Form so aus:
newlist = [expression for item in iterable]
Das ist äquivalent zu:
newlist = []
for item in iterable:
# optional: if condition:
newlist.append(expression)
===== Teile einer List Comprehension =====
==== Expression ====
Die **Expression** ist der Teil, der tatsächlich in der neuen Liste landet. Sie kann:
* einfach das aktuelle Element sein (`item`)
* oder eine beliebige Berechnung / Funktionsanwendung auf `item`.
- **Beispiel mathematische Operation**:
# Expression = x * 2
doubled = [x * 2 for x in range(5)]
# Ergebnis: [0, 2, 4, 6, 8]
- **Beispiel mit Funktionsaufruf**:
cars = ['audi', 'bmw', 'subaru', 'toyota']
newlist = [car.upper() for car in cars]
print(newlist) # ['AUDI', 'BMW', 'SUBARU', 'TOYOTA']
==== Item ====
**item** ist der Name für das aktuelle Element der Iteration. Er wird im ''for''-Teil definiert: ''for item in iterable''.
- **Beispiel**:
cars = ['audi', 'bmw', 'subaru', 'toyota']
newlist = [item.upper() for item in cars]
print(newlist)
Hier ist ''item'' nacheinander '''audi''', '''bmw''', '''subaru''', '''toyota'''.
==== Iterable ====
Das **Iterable** kann ein beliebiges iterierbares Objekt sein, z. B. eine Liste, ein Tupel, ein Set, ein String oder das Ergebnis von ''range()''.
- **Beispiel mit einer Liste**:
squared = [x**2 for x in [1, 2, 3, 4]]
# Ergebnis: [1, 4, 9, 16]
numbers = [1, 2, 3, 4]
squared = [x**2 for x in numbers]
# Ergebnis: [1, 4, 9, 16]
- **Beispiel mit einem Tupel**:
doubled = [x * 2 for x in (1, 2, 3, 4)]
# Ergebnis: [2, 4, 6, 8]
- **Beispiel mit range()**:
newlist = [x for x in range(10)]
# Ergebnis: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
==== Condition ====
Die **Condition** ist ein optionaler Filter, der entscheidet, ob ein Element in die neue Liste aufgenommen wird. Nur wenn die Bedingung ''True'' ergibt, wird ''expression'' übernommen.
- **Beispiel mit Filter**:
cars = ['audi', 'vw', 'seat', 'skoda', 'tesla']
newlist = [car for car in cars if car != 'tesla']
# newlist = ['audi', 'vw', 'seat', 'skoda']
Die Bedingung ''car != 'tesla%%'%%'' liefert ''True'' für alle Elemente ausser '''tesla%%'%%'', daher enthält die neue Liste alle Autos ausser Tesla.
Die Bedingung ist optional und kann weggelassen werden:
- **Ohne Filter**:
newlist = [x for x in cars]
# Kopie der ursprünglichen Liste
===== Weitere Beispiele =====
- **Mit einem Iterable eines anderen Typs (String)**:
letters = [letter for letter in 'Hallo Welt']
# Ergebnis: ['H', 'a', 'l', 'l', 'o', ' ', 'W', 'e', 'l', 't']
- **Nested List Comprehensions (verschachtelt)**:
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
# Ergebnis: [1, 2, 3, 4, 5, 6, 7, 8, 9]
List Comprehensions sind ein mächtiges Werkzeug in Python, um vorhandene Daten in einer einzigen, klaren Zeile zu **transformieren** und (falls nötig) zu **filtern**. Richtig eingesetzt machen sie Code kürzer und oft besser lesbar.
----
{{tag>M323-LU04}}
[[https://creativecommons.org/licenses/by-nc-sa/4.0/ch/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] (c) Kevin Maurizi