Listenverständnis in Python – mit Beispielen

In Python erleichtern sogenannte „List Comprehensions“ die Erstellung neuer Listen basierend auf vorhandenen iterierbaren Objekten wie Listen, Zeichenketten und Tupeln.

Ihre kompakte Syntax ermöglicht es, neue Listen mit nur einer einzigen Codezeile zu generieren. In diesem Tutorial wird genau das demonstriert.

In den folgenden Minuten werden Sie lernen:

  • Wie man mit Hilfe von for-Schleifen eine neue Liste erstellt.
  • Die spezielle Syntax zur Anwendung von List Comprehensions in Python.
  • Wie man List Comprehensions in Verbindung mit bedingten if-Anweisungen modifiziert.

Zusätzlich werden Sie mehrere Codebeispiele durcharbeiten, die Ihr Verständnis für List Comprehensions vertiefen.

Legen wir los. 🌊

Erstellen von Python-Listen mit for-Schleifen

Nehmen wir an, Sie haben eine Liste von Zahlen. Sie möchten eine neue Liste erstellen, welche die Kubikzahlen aller Einträge aus der ursprünglichen Liste enthält. So würden Sie dies mit einer for-Schleife in Python realisieren:

nums = [2,3,5,7]
num_cubes = []
for num in nums:
  num_cubes.append(num**3)

print(num_cubes)

# Ausgabe
[8, 27, 125, 343]

Im obigen Code werden folgende Schritte ausgeführt:

  • Eine leere Liste namens num_cubes wird initialisiert.
  • Die Liste der Zahlen nums wird durchlaufen.
  • Jede Zahl num wird genommen, und ihre dritte Potenz wird mit dem Potenzierungsoperator ** berechnet: num**3.
  • Der berechnete Kubikwert wird zur Liste num_cubes hinzugefügt.

Hinweis: In Python wird der Potenzierungsoperator ** mit der Syntax num**pow verwendet, wobei die Zahl num mit pow potenziert wird.

Allerdings gibt es mit List Comprehensions eine deutlich einfachere Methode in Python. Betrachten wir nun die entsprechende Syntax.

Syntax der Python List Comprehension

Die allgemeine Syntax einer List Comprehension ist wie folgt:

<neue_liste> = [<ausdruck> for <element> in <iterierbar>]

Analysieren wir diese Syntax im Detail:

  • Listen werden in Python durch eckige Klammern [] gekennzeichnet, daher muss die List Comprehension ebenfalls in [] eingeschlossen werden.
  • <element> in <iterierbar> bedeutet, dass ein iterierbares Objekt durchlaufen wird. Jedes Python-Objekt, das sequenziell durchlaufen werden kann und auf seine einzelnen Elemente zugreifen kann, wie etwa Listen, Tupel und Zeichenketten, ist iterierbar.
  • <ausdruck> repräsentiert den Wert, der für jedes <element> im <iterierbar> berechnet werden soll.

Das klingt doch recht unkompliziert, oder?

Im Wesentlichen möchten Sie mit jedem Element einer Liste (oder eines iterierbaren Objekts) eine bestimmte Operation durchführen, um eine neue Liste zu generieren.

Dies vereinfacht die Syntax, wie in der folgenden Grafik veranschaulicht:

Python List Comprehension Syntax (Bild vom Autor)

Nachdem Sie nun die Syntax verstanden haben, ist es an der Zeit, dies in Code umzusetzen. Sie können entweder die Online-Python-IDE von wdzwdz nutzen, um diese Beispiele nachzuvollziehen, oder Sie führen diese auf Ihrem lokalen Computer aus.

Beispiele für Python List Comprehension

Im vorherigen Abschnitt wurde eine neue Liste num_cubes aus nums erstellt. Beginnen wir damit, dies mit List Comprehension zu realisieren.

List Comprehension mit Zahlen verwenden

Nutzen wir nun die vereinfachte Syntax, indem wir Folgendes berücksichtigen:

  • <operation>: Hier müssen wir jede Zahl potenzieren. Ersetzen wir also <operation> durch num**3.
  • <jedes_element>: Die Schleifenvariable ist num – die einzelnen Zahlen aus der Liste.
  • <diese_liste>: Die vorhandene Liste ist nums.
  • Folglich lautet der finale Ausdruck: [num**3 for num in nums]. ✅

Zusammenfassend haben wir den folgenden Code:

num_cubes = [num**3 for num in nums]
print(num_cubes)

# Ausgabe
[8, 27, 125, 343]

Herzlichen Glückwunsch, Sie haben Ihre erste List Comprehension geschrieben! 🎉

Lassen Sie uns nun mit Python-Strings arbeiten.

List Comprehension mit Zeichenketten verwenden

Angenommen, Sie haben eine Liste mit Autoren – Sie können die Liste unten durch Ihre Lieblingsautoren ersetzen. 😄

authors = ["jane austen","george orwell","james clear","cal newport"]

Beachten Sie, dass die Namen der Autoren in der obigen Liste in Kleinbuchstaben geschrieben sind. Nun möchten wir diese in der Title-Case-Schreibweise formatieren und in einer neuen Liste mit dem Namen author_list speichern.

Hinweis: In Python nimmt die String-Methode title() eine Zeichenkette als Argument und gibt eine Kopie der Zeichenkette zurück, die im Title-Case formatiert ist. Das bedeutet, dass der erste Buchstabe jedes Wortes großgeschrieben wird: Vorname Nachname.

Hier ist, was Sie tun müssen:

  • Iterieren Sie durch die Liste authors, und für jeden Autor in der Liste,
  • rufen Sie author.title() auf, um eine Kopie der Zeichenkette im Title-Case zu erhalten.

Der entsprechende Python-Code sieht wie folgt aus:

authors = ["jane austen","george orwell","james clear","cal newport"]

author_list = [author.title() for author in authors]
print(author_list)

# Ausgabe
['Jane Austen', 'George Orwell', 'James Clear', 'Cal Newport']

Beachten Sie in der obigen Ausgabe, wie alle Autorennamen im Title-Case formatiert wurden – genau wie gewünscht.

List Comprehension mit mehreren Listen verwenden

Bisher haben Sie gelernt, wie Sie mit List Comprehensions neue Listen auf der Grundlage einer einzelnen Liste erstellen. Lassen Sie uns nun lernen, wie Sie eine neue Liste aus mehreren Listen erzeugen.

Betrachten Sie beispielsweise folgendes Problem: Sie haben zwei Listen, l_arr und b_arr, welche die Längen und Breiten von vier Rechtecken enthalten.

Sie müssen eine neue Liste area erstellen, welche die Flächen der vier Rechtecke enthält. Zur Erinnerung: Fläche = Länge * Breite.

l_arr = [4,5,1,3]
b_arr = [2,1,7,9]

Zur Berechnung der Fläche benötigen Sie Elemente aus beiden Listen (l_arr und b_arr). Dies lässt sich mit der zip()-Funktion in Python umsetzen.

Hinweis: Die zip()-Funktion in Python nimmt ein oder mehrere iterierbare Objekte als Argumente entgegen (Syntax: zip(*iterables)). Sie gibt einen Iterator von Tupeln zurück, wobei das Tupel i das i-te Element jedes iterierbaren Objekts enthält.

Die folgende Grafik illustriert dies im Detail. Es gibt 4 Werte in l_arr und b_arr, so dass der Indexbereich von 0 bis 3 reicht. Wie Sie sehen, enthält Tupel 0 l_arr[0] und b_arr[0]; Tupel 1 enthält l_arr[1] und b_arr[1] und so weiter.

Python zip()-Funktion (Bild vom Autor)

Daher können Sie zip(l_arr,b_arr) wie unten gezeigt durchlaufen:

area = [l*b for l,b in zip(l_arr,b_arr)]
print(area)

# Ausgabe
[8,5,7,27]

Im folgenden Abschnitt erfahren Sie, wie Sie bedingte Anweisungen innerhalb einer List Comprehension verwenden können.

Python List Comprehension mit Bedingungssyntax

Beginnen wir damit, die vorherige Syntax der List Comprehension zu erweitern.

Hier die vollständige Syntax:

<neue_liste> = [<ausdruck> for <element> in <iterierbar> if <bedingung>]

Anstatt <ausdruck> für jedes Element zu berechnen, möchten Sie dies nur für die Elemente tun, welche die bestimmte <bedingung> erfüllen – d.h. die Bedingung als True auswerten. Dies führt zu der vereinfachten Syntax:

Python List Comprehension mit Bedingungssyntax (Bild vom Autor)

▶ Gehen wir zu Codebeispielen über.

Python List Comprehension mit Bedingungsbeispielen

#1. Sie haben den String „Ich lerne Python im Jahr 2022“. Sie möchten eine Liste aller Ziffern in diesem String erhalten. Wie machen Sie das?

In Python prüft <zeichen>.isdigit(), ob ein Zeichen <zeichen> eine Ziffer (0-9) ist; wenn ja, gibt es True zurück, andernfalls False.

Der folgende Code demonstriert, wie Sie eine Liste aller Ziffern in einem String namens str1 erstellen können:

str1 = "Ich lerne Python3 im Jahr 2022"

digits = [char for char in str1 if char.isdigit()]

print(digits)

# Ausgabe
['3', '2', '0', '2', '2']

Im obigen Code gilt:

  • Sie durchlaufen den String str1,
  • Sie greifen auf jedes Zeichen zu, um mit der Methode isdigit() zu überprüfen, ob es sich um eine Ziffer handelt, und
  • fügen das Zeichen nur dann der neuen Liste hinzu, wenn es sich um eine Ziffer handelt.

Nehmen wir ein weiteres Beispiel.

#2. Sie haben eine Liste von Früchten. 🍊 Sie möchten eine Liste mit dem Namen beginnt_mit_b erstellen, welche alle Früchte der Liste enthält, die mit dem Buchstaben „b“ beginnen. Sie können die Methode startswith() verwenden, um die Bedingung zu definieren.

<string>.startswith('zeichen') gibt True zurück, wenn <string> mit 'zeichen' beginnt; ansonsten False.

fruits = ['blueberry','apple','banana','orange','cherry']

starts_with_b = [fruit for fruit in fruits if fruit.startswith('b')]

print(starts_with_b)

# Ausgabe
['blueberry', 'banana']

In der obigen Ausgabe erhalten wir „blueberry“ und „banana“ als die beiden Früchte, welche, wie erwartet, mit „b“ in der Liste fruits beginnen.

Und damit ist unsere Diskussion über List Comprehensions abgeschlossen.

Zusammenfassung

Ich hoffe, dieses Tutorial hat Ihnen geholfen, das Konzept von List Comprehensions in Python zu verstehen.

Fassen wir zusammen:

  • Sie können [<operation> for <jedes_element> in <diese_liste>] verwenden, um mit Hilfe von List Comprehension eine neue Liste zu erstellen.
  • Zusätzlich können Sie die Syntax [<operation> for <jedes_element> in <diese_liste> if <bedingung_ist_wahr>] mit der bedingten if-Anweisung anwenden.

Darüber hinaus haben Sie mehrere Codebeispiele durchgearbeitet. Als nächsten Schritt können Sie versuchen, einige Ihrer vorhandenen Python-Schleifen zur Listenerstellung mit List Comprehensions neu zu gestalten. Viel Spaß beim Programmieren! Bis zum nächsten Tutorial. 😄

Sie können sich nun ansehen, wie Sie eine Liste in ein Dictionary umwandeln oder wie Sie mit Dateien in Python umgehen.