Python List Comprehension erstellen

Im folgenden Beitrag erkläre ich Python List Comprehension als Methode um Listen effektiv und mit wenig Code zu erstellen. Grundlage bilden hierbei immer andere iterierbare Objekte, wie Listen oder Dictionaries.

Wie man durch Listen iterieren kann oder auf Elemente einer Liste zugreift, erkläre ich im Artikel Python Listen erstellen und bearbeiten

List Comprehension erstellen

Eine List Comprehensionist immer eine Liste, die einen Ausdruck, eine Schleife und gegebenenfalls mehrere weitere Schleifen oder Bedingungen enthält.

Ein einfaches Beispiel, in dem die Werte der ursprünglichen Liste mit 2 multipliziert werden:

>>> numbers = [1,2,3,4,5,6]
>>> numbers_times_2 = [x*2 for x in numbers]
>>> numbers_times_2
[2, 4, 6, 8, 10, 12]

Das entspricht dem folgenden Code mit einer for-Schleife:

>>> numbers_times_2 = []
>>> for x in numbers:
...     numbers_times_2.append(x*2)
... 
>>> numbers_times_2
[2, 4, 6, 8, 10, 12]

List Comprehension mit Bedingungen erzeugen

Ein ähnliches Beispiel, jedoch mit einer Bedingung, dass der Wert eine gerade Zahl ist sieht so aus:

>>> numbers_times_2_even = [x*2 for x in numbers if x % 2 == 0]
>>> numbers_times_2_even
[4, 8, 12]

Auch hier nun das Equivalent mit Schleife und Bedingung:

>>> numbers_times_2_even = []
>>> for x in numbers:
...     if x % 2 == 0:
...         numbers_times_2_even.append(x*2)
... 
>>> numbers_times_2_even
[4, 8, 12]

List Comprehension mit mehreren for Schleifen erzeugen

Im folgenden Beispiel erzeuge ich eine neue Liste basierend auf zwei anderen Listen, wobei die Elemente der Listen untereinander verglichen werden. Beachte dabei die Variablenbezeichnungen mit und ohne ’s‘

>>> combinated_colors = [(base_color, mixed_color) for base_color in base_colors for mixed_color in mixed_colors if base_color in mixed_color]
>>> combinated_colors
[('red', ('red', 'yellow')), ('green', ('blue', 'green')), ('blue', ('blue', 'green'))]

Der gleiche Code sieht in verschachtelter Form wie folgt aus:

>>> combinated_colors = []
>>> for base_color in base_colors:
...     for mixed_color in mixed_colors:
...         if base_color in mixed_color:
...             combinated_colors.append((base_color, mixed_color))
... 
>>> combinated_colors
[('red', ('red', 'yellow')), ('green', ('blue', 'green')), ('blue', ('blue', 'green'))]

Die Reihenfolge der for-Schleifen und der if-Bedingung ist in beiden Fällen identisch.

List Comprehension verschachteln

Da List Comprehensions selbst wieder Listen erzeugen, können diese natürlich auch als Basis für weitere List Comprehensions sein. Ich zeige euch hier ein Beispiel:

Angenommen wir haben einen Datensatz mit Temperaturen an verschiedenen Wochentagen. Die Liste besteht aus Tupeln (Wochentag, Datum, Temperarur). Wir möchten jetzt alle Arbeitstage finden, an denen über 30°C erreicht wurden, Wochenenden interessieren uns nicht.

>>> weekday_temperatures = [
...   {'day': 'Monday',    'date': '2019-07-15', 'temperature': 31},
...   {'day': 'Tuesday',   'date': '2019-07-16', 'temperature': 33},
...   {'day': 'Wednesday', 'date': '2019-07-17', 'temperature': 27},
...   {'day': 'Thursday',  'date': '2019-07-18', 'temperature': 25},
...   {'day': 'Friday',    'date': '2019-07-19', 'temperature': 30},
...   {'day': 'Saturday',  'date': '2019-07-20', 'temperature': 31},
...   {'day': 'Sunday',    'date': '2019-07-21', 'temperature': 29},
...   {'day': 'Monday',    'date': '2019-07-22', 'temperature': 25},
...   {'day': 'Tuesday',   'date': '2019-07-23', 'temperature': 31},
...   {'day': 'Wednesday', 'date': '2019-07-24', 'temperature': 26},
...   {'day': 'Thursday',  'date': '2019-07-25', 'temperature': 23},
...   {'day': 'Friday',    'date': '2019-07-26', 'temperature': 22},
...   {'day': 'Saturday',  'date': '2019-07-27', 'temperature': 23},
...   {'day': 'Sunday',    'date': '2019-07-28', 'temperature': 32}
... ]
>>> hot_work_days = [
...     (hot_day['date'], hot_day['temperature']) for hot_day in
...     [
...         workday for workday in weekday_temperatures if workday['day'] not in ['Saturday', 'Sunday']
...     ] if hot_day['temperature'] >= 30
... ]
>>> hot_work_days
[('2019-07-15', 31), ('2019-07-16', 33), ('2019-07-19', 30), ('2019-07-23', 31)]

Die interne List Comprehension erzeugt eine Liste mit allen Arbeitstagen, die äußere List Comprehension erzeugt anschließend eine Liste mit den heißen Arbeitstagen und filtert den ‚day‘ Eintrag heraus.

Klar könnte man die Prüfung auf Tag und Temperatur auch in einem Schritt machen, aber hier sei es mal für das Beispiel getrennt.

Wer jetzt noch nicht genug hat, kann sich die offizielle Python Dokumentation zu List Comprehensions ansehen und noch mehr Beispiele finden.

Eine Antwort auf „Python List Comprehension erstellen“

Kommentare sind geschlossen.