Python-List Comprehensions und if: Umfassende Erklärung!

目次

1. Einführung

Die „List Comprehension“ in Python ist eine bequeme Syntax, um Listen prägnant zu erstellen. Im Vergleich zur Erstellung von Listen mit einer normalen for-Schleife bietet sie Vorteile sowohl in Bezug auf die Lesbarkeit des Codes als auch auf die Ausführungsgeschwindigkeit.

Insbesondere ermöglicht die Kombination der List Comprehension mit einer if-Anweisung das Extrahieren nur der Elemente, die eine Bedingung erfüllen, und erlaubt dadurch flexiblere Listenoperationen. In diesem Artikel erklären wir detailliert, wie man List Comprehensions in Python mit if kombiniert, von den Grundlagen bis zu fortgeschrittenen Anwendungen.

Was ist eine List Comprehension?

Die List Comprehension ist eine Syntax in Python, um Listen prägnant zu erstellen. Sie ermöglicht es, Programme mit kürzerem Code zu schreiben, der eine höhere Lesbarkeit aufweist, im Vergleich zur Verwendung einer normalen for-Schleife.

Zum Beispiel sieht die Erstellung einer Liste mit Ganzzahlen von 0 bis 4 mit einer normalen for-Schleife wie folgt aus.

numbers = []
for i in range(5):
    numbers.append(i)
print(numbers)  # [0, 1, 2, 3, 4]

Allerdings kann man mit einer List Comprehension dies in einer einzigen Zeile schreiben.

numbers = [i for i in range(5)]
print(numbers)  # [0, 1, 2, 3, 4]

Die Vorteile der Verwendung von List Comprehensions

Durch die Nutzung von List Comprehensions ergeben sich folgende Vorteile.

  1. Der Code wird kürzer und die Lesbarkeit verbessert sich
  • Im Vergleich zu einer normalen for-Schleife kann die Anzahl der Codezeilen reduziert werden, was zu einem übersichtlicheren Code führt.
  1. Die Verarbeitungsgeschwindigkeit verbessert sich
  • Da List Comprehensions die internen Optimierungen von Python besser nutzen als for-Schleifen, ist die Verarbeitung in der Regel schneller.
  1. Das Filtern von Listen wird einfach
  • Durch die Kombination mit einer if-Anweisung können nur Elemente extrahiert werden, die einer bestimmten Bedingung entsprechen.

Warum List Comprehensions mit if kombinieren?

Durch die Kombination von List Comprehensions mit if können die Elemente einer Liste dynamisch gefiltert werden. Zum Beispiel sieht die Speicherung nur der geraden Zahlen aus den Ganzzahlen von 0 bis 9 mit einer for-Schleife wie folgt aus.

evens = []
for i in range(10):
    if i % 2 == 0:
        evens.append(i)
print(evens)  # [0, 2, 4, 6, 8]

Allerdings kann man mit einer List Comprehension diese Verarbeitung in einer einzigen Zeile umsetzen.

evens = [i for i in range(10) if i % 2 == 0]
print(evens)  # [0, 2, 4, 6, 8]

Auf diese Weise wird durch die Kombination von List Comprehensions mit if das Hinzufügen nur der Elemente, die eine Bedingung erfüllen, zu einer einfachen Aufgabe.

Was man in diesem Artikel lernt

In diesem Artikel erklären wir detailliert die Kombination von List Comprehensions und if-Anweisungen in Python und decken folgende Inhalte ab.

  • Die grundlegende Syntax von List Comprehensions
  • Bedingte List Comprehensions mit if
  • List Comprehensions mit if-else
  • Die Nutzung verschachtelter List Comprehensions
  • Achtungspunkte und Best Practices bei der Verwendung von List Comprehensions
  • Häufig gestellte Fragen (FAQ)

Durch die Nutzung von List Comprehensions kann Python-Code einfacher und effizienter geschrieben werden. Wir werden dies im Folgenden detailliert erläutern, daher lesen Sie bitte bis zum Ende durch und vertiefen Sie Ihr Verständnis, indem Sie den Code selbst ausprobieren!

2. Grundlagen der List Comprehensions in Python

In der vorherigen Sektion haben wir List Comprehensions vorgestellt und ihre Vorteile erläutert. Hier erklären wir die grundlegende Syntax der List Comprehensions im Detail und vertiefen das Verständnis durch konkrete Beispiele.

Grundlegende Syntax der List Comprehensions

Die grundlegende Syntax der List Comprehensions sieht wie folgt aus.

[expression for variable in iterable]

Elemente der Syntax

  • expression: Die auf die Variable anzuwendende Verarbeitung (Berechnung oder Funktion usw.)
  • for variable in iterable: Schleife, die jedes Element aus einem Iterable (Liste, Tupel, Range usw.) extrahiert

Zum Beispiel sieht es bei der Erstellung einer Liste mit Ganzzahlen von 0 bis 4 mit einer normalenfor-Schleife wie folgt aus.

numbers = []
for i in range(5):
    numbers.append(i)
print(numbers)  # [0, 1, 2, 3, 4]

Allerdings kann man mit List Comprehensions das in einer Zeile schreiben.

numbers = [i for i in range(5)]
print(numbers)  # [0, 1, 2, 3, 4]

Grundlegende Beispiele für List Comprehensions

Durch die Verwendung von List Comprehensions wird die Erstellung und Umwandlung von Listen einfach. Hier stellen wir einige grundlegende Beispiele vor.

1. Jedes Element quadrieren

Ein Beispiel, das mit List Comprehensions die Quadrate der Zahlen von 0 bis 9 in einer Liste speichert.

squares = [i**2 for i in range(10)]
print(squares)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Im Vergleich zur Schreibweise mit einer normalenfor-Schleife wird erkennbar, dass der Code erheblich gekürzt wird.

squares = []
for i in range(10):
    squares.append(i**2)
print(squares)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

2. Eine Liste von Strings verarbeiten

Ein Beispiel, das eine Liste von Strings in Großbuchstaben umwandelt.

words = ["python", "list", "comprehension"]
uppercase_words = [word.upper() for word in words]
print(uppercase_words)  # ['PYTHON', 'LIST', 'COMPREHENSION']

Die gleiche Verarbeitung mit einerfor-Schleife sieht wie folgt aus.

words = ["python", "list", "comprehension"]
uppercase_words = []
for word in words:
    uppercase_words.append(word.upper())
print(uppercase_words)  # ['PYTHON', 'LIST', 'COMPREHENSION']

Mit List Comprehensions kann die Datenumwandlung einfach beschrieben werden.

3. Liste flachmachen (Elemente aus verschachtelten Listen extrahieren)

Auch zum Umwandeln einer verschachtelten Liste (2D-Liste) in eine eindimensionale Liste ist List Comprehension nützlich.

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
print(flattened)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

Mit einer normalenfor-Schleife sind verschachtelte Schleifen wie folgt notwendig.

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = []
for row in matrix:
    for num in row:
        flattened.append(num)
print(flattened)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

Es wird klar, dass mit List Comprehensions die Verschachtelung der Schleifen einfach beschrieben werden kann.

Vergleich von List Comprehensions und normalenfor-Schleifen

KriteriumList ComprehensionNormalefor-Schleife
Kürze des CodesKurz (kann in einer Zeile beschrieben werden)Lang (mehrere Zeilen Code notwendig)
LesbarkeitEinfach und intuitiv (bei einfachen Verarbeitungen leicht verständlich)Bei Länge lesbarer, aber tendenziell redundant
AusführungsgeschwindigkeitSchnell (Python-interne Optimierung wirkt)Etwas langsamer (aufgrund expliziter Schleifenverarbeitung)
LesbarkeitsgrenzeBei tiefer Verschachtelung schwer lesbarAuch bei tiefer Verschachtelung leicht zu organisieren

Grundsätzlich ist es am besten, einfache Verarbeitungen mit List Comprehensions und komplexe mit normalenfor-Schleifen durchzuführen.

Zusammenfassung

  • List Comprehensions sind eine bequeme Funktion, um Listen mit knapper Syntax zu erstellen
  • Die grundlegende Syntax ist [expression for variable in iterable]
  • Kann für verschiedene Zwecke wie numerische Berechnungen, String-Umwandlungen, Flachmachen von Listen usw. verwendet werden
  • Der Code wird kürzer als bei normalenfor-Schleifen und die Verarbeitungsgeschwindigkeit verbessert sich
  • Allerdings sollte man beachten, dass bei tiefer Verschachtelung die Lesbarkeit abnimmt
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

3. if verwendete bedingte List Comprehension

Im vorherigen Abschnitt haben wir die Grundlagen der List Comprehension gelernt. Hier erklären wir, wie man if in die List Comprehension einbaut, um bedingte Listen zu erstellen.

Durch das Hinzufügen von if zur List Comprehension wird das Filtern von Listen erleichtert, und nur Elemente, die eine bestimmte Bedingung erfüllen, können zur Liste hinzugefügt werden.

Grundlegende Syntax der List Comprehension mit if

Beim Erstellen einer Liste mit einer Bedingung lautet die grundlegende Syntax wie folgt.

[Ausdruck for Variable in Iterable if Bedingung]

Elemente der Syntax

  • Ausdruck: Die Verarbeitung, die auf jedes Element angewendet wird
  • for Variable in Iterable: Durchläuft ein Iterable (Liste, Tupel, Range usw.)
  • if Bedingung: Fügt nur hinzu, wenn die Bedingung mit einer if-Anweisung erfüllt ist

Grundlegende Verwendungsbeispiele

1. Nur gerade Zahlen extrahieren

Zum Beispiel, um nur die geraden Zahlen aus den Ganzzahlen von 0 bis 9 in eine Liste zu speichern, würde eine normale for-Schleife wie folgt aussehen.

evens = []
for i in range(10):
    if i % 2 == 0:
        evens.append(i)
print(evens)  # [0, 2, 4, 6, 8]

Mit List Comprehension kann dies wie folgt kompakt geschrieben werden.

evens = [i for i in range(10) if i % 2 == 0]
print(evens)  # [0, 2, 4, 6, 8]

→Durch das Einbauen der if-Anweisung in die List Comprehension kann der überflüssige append() weggelassen werden, und der Code wird kürzer.

2. Filtern von String-Listen

Mit List Comprehension können auch nur Elemente extrahiert werden, die eine bestimmte Bedingung aus einer Liste von Strings erfüllen.

Zum Beispiel, um nur Programmiersprachen mit 5 oder mehr Zeichen aus „python“, „java“, „c++“, „ruby“ in eine Liste zu speichern, schreibt man es wie folgt.

languages = ["python", "java", "c++", "ruby"]
long_languages = [lang for lang in languages if len(lang) >= 5]
print(long_languages)  # ['python']

3. Wörter extrahieren, die ein bestimmtes Zeichen enthalten

Mit List Comprehension können auch nur Wörter extrahiert werden, die ein bestimmtes Zeichen enthalten.

Zum Beispiel, um nur Wörter zu extrahieren, die "a" enthalten, kann man es wie folgt schreiben.

words = ["apple", "banana", "cherry", "date"]
words_with_a = [word for word in words if "a" in word]
print(words_with_a)  # ['apple', 'banana', 'date']

Mehrere Bedingungen angeben

Beim Angeben mehrerer Bedingungen in der if-Anweisung können and oder or verwendet werden.

1. Nur gerade Zahlen und Vielfache von 3 extrahieren

filtered_numbers = [i for i in range(20) if i % 2 == 0 and i % 3 == 0]
print(filtered_numbers)  # [0, 6, 12, 18]

2. Strings extrahieren, die mehrere Bedingungen erfüllen

words = ["python", "java", "c++", "ruby", "go", "haskell"]
filtered_words = [word for word in words if len(word) >= 5 and "o" in word]
print(filtered_words)  # ['python']

Häufige Fehler und Maßnahmen

1. Falsche Position von if

Falsches Beispiel (ungültige Position von if)

numbers = [if i % 2 == 0 for i in range(10)]

Fehler: SyntaxError: invalid syntaxKorrektes Beispiel

numbers = [i for i in range(10) if i % 2 == 0]

2. Falsche Verwendung von and / or

Falsches Beispiel

words = ["apple", "banana", "cherry"]
filtered_words = [word for word in words if len(word) > 5 or "a" in word]

Um das erwartete Ergebnis zu erhalten, and verwenden

filtered_words = [word for word in words if len(word) > 5 and "a" in word]

Zusammenfassung

  • Durch das Hinzufügen von if zur List Comprehension können nur Elemente, die die Bedingung erfüllen, zur Liste hinzugefügt werden
  • Die Syntax lautet [Ausdruck for Variable in Iterable if Bedingung]
  • Sie kann für verschiedene Zwecke verwendet werden, wie das Extrahieren gerader Zahlen oder das Filtern von Strings
  • Bei mehreren Bedingungen and / or nutzen
  • Auf die Position von if und die Schreibweise der Bedingungen achten, da Fehler sonst auftreten

4. List Comprehension mit if-else

In der vorherigen Sektion haben wir gelernt, wie man die Elemente einer Liste mit if filtert. Wenn Sie jedoch je nach Bedingung unterschiedliche Werte in die Liste speichern möchten, müssen Sie if-else kombinieren.

In dieser Sektion erklären wir detailliert, wie man List Comprehensions mit if-else schreibt, und geben praktische Beispiele.

Grundlegende Syntax von List Comprehension mit if-else

Die Syntax, wenn if-else in eine List Comprehension integriert wird, sieht wie folgt aus.

[Ausdruck1 if Bedingung else Ausdruck2 for Variable in Iterable]

Elemente der Syntax

  • Ausdruck1: Der Wert oder die Verarbeitung, die angewendet wird, wenn Bedingung erfüllt ist
  • Bedingung: Die Bedingung, die mit if angegeben wird
  • else Ausdruck2: Der Wert oder die Verarbeitung, die angewendet wird, wenn Bedingung nicht erfüllt ist
  • for Variable in Iterable: Durchläuft ein Iterable (z. B. Liste, Range)

Achten Sie darauf, dass if vor for kommt, wenn Sie if-else verwenden!→Bei if allein schreibt man es nach for, aber bei if-else vor for.

Grundlegende Verwendungsbeispiele

1. Gerade Zahlen unverändert, ungerade zu „ungerade“ konvertieren

Zum Beispiel, um bei Ganzzahlen von 0 bis 9 gerade Zahlen unverändert in die Liste zu speichern und ungerade zu „ungerade“ zu konvertieren, sieht eine normale for-Schleife so aus.

numbers = []
for i in range(10):
    if i % 2 == 0:
        numbers.append(i)
    else:
        numbers.append("ungerade")

print(numbers)  
# [0, 'ungerade', 2, 'ungerade', 4, 'ungerade', 6, 'ungerade', 8, 'ungerade']

Mit List Comprehension kann das in einer Zeile geschrieben werden.

numbers = [i if i % 2 == 0 else "ungerade" for i in range(10)]
print(numbers)  
# [0, 'ungerade', 2, 'ungerade', 4, 'ungerade', 6, 'ungerade', 8, 'ungerade']

→Durch die Verwendung von if und else wird klar, dass die Werte in der Liste flexibel konvertiert werden können.

2. Werte ≤ 0 zu „negativ“ konvertieren

Zum Beispiel, um in einer Liste numerische Werte, die ≤ 0 sind, zu "negativ" zu konvertieren und andere Werte unverändert zu lassen.

numbers = [-5, 3, 0, 8, -2, 7]
modified_numbers = [num if num > 0 else "negativ" for num in numbers]
print(modified_numbers)  
# ['negativ', 3, 'negativ', 8, 'negativ', 7]

3. Zahlen nach Vorzeichen klassifizieren

Zum Beispiel, um Ganzzahlen in einer Liste in „positiv“ (positive Zahlen) und „negativ“ (negative Zahlen) zu klassifizieren, kann man das so schreiben.

numbers = [-10, 15, 0, -5, 20]
categories = ["positiv" if num > 0 else "negativ" for num in numbers]
print(categories)  
# ['negativ', 'positiv', 'negativ', 'negativ', 'positiv']

Achtungspunkte beim Verwenden von if-else in List Comprehensions

1. Falsche Position von if vermeiden

Falsches Beispiel (führt zu einem Fehler)

numbers = [i for i in range(10) if i % 2 == 0 else "ungerade"]

Fehler: SyntaxError: invalid syntaxRichtige Schreibweise

numbers = [i if i % 2 == 0 else "ungerade" for i in range(10)]

👉Bei if-else muss es vor for beschrieben werden!

2. Unterschied zwischen if-else und if

  • Nur if (Filterung von Elementen)
  evens = [i for i in range(10) if i % 2 == 0]
  print(evens)  # [0, 2, 4, 6, 8]

→Bei nur if werden Elemente, die die Bedingung nicht erfüllen, nicht in die Liste aufgenommen.

  • if-else verwenden (Werte konvertieren)
  numbers = [i if i % 2 == 0 else "ungerade" for i in range(10)]
  print(numbers)  # [0, 'ungerade', 2, 'ungerade', 4, 'ungerade', 6, 'ungerade', 8, 'ungerade']

→Mit if-else werden alle Elemente in die Liste aufgenommen und je nach Bedingung konvertiert.

Zusammenfassung

  • Mit if-else können je nach Bedingung unterschiedliche Werte in die Liste gespeichert werden
  • Bei if-else muss es vor for beschrieben werden
  • Im Gegensatz zu List Comprehension mit nur if können alle Elemente in die Liste aufgenommen und konvertiert werden
  • Nützlich zur Klassifizierung von Zahlen und Strings oder zum Ändern von Werten unter bestimmten Bedingungen
  • Mit verschachtelten if-else können mehrere Bedingungen kombiniert werden
年収訴求

5. Verschachtelte List Comprehensions und Bedingungen

In der vorherigen Sektion haben wir List Comprehensions mit if-else gelernt. In dieser Sektion erklären wir die Verwendung von verschachtelten List Comprehensions (List Comprehensions mit mehrfachen Schleifen).

Mit List Comprehensions können Sie mehrfache Schleifen (Verschachtelung) verwenden, genau wie bei normalen for-Schleifen. Dadurch können Listen von Listen (z. B. 2D-Listen) effektiv verarbeitet werden.

Grundlegende Syntax verschachtelter List Comprehensions

Die grundlegende Syntax für das Verschachteln von Schleifen in List Comprehensions ist wie folgt.

[Ausdruck for Variable1 in Iterable1 for Variable2 in Iterable2]

Elemente der Syntax

  • Ausdruck: Die auf die Variable anzuwendende Verarbeitung
  • for Variable1 in Iterable1: Die erste Schleife
  • for Variable2 in Iterable2: Die innere Schleife (verschachtelte Schleife)

Genau wie bei normalen for-Schleifen ist der Punkt, dass die Schleifen von links nach rechts ausgeführt werden.

Grundlegende Verwendungsbeispiele

1. Flachmachen einer 2D-Liste (Flattening)

Zum Beispiel, um eine 2D-Liste (Liste von Listen) in eine eindimensionale Liste umzuwandeln, sieht es bei normalen for-Schleifen so aus.

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = []
for row in matrix:
    for num in row:
        flattened.append(num)
print(flattened)  
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

Mit List Comprehension kann es in einer Zeile beschrieben werden.

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
print(flattened)  
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

→ Durch die Anwendung der verschachtelten Schleifen auf List Comprehensions können Sie kürzeren und intuitiveren Code schreiben.

2. Alle Kombinationen erstellen

Zum Beispiel, um alle Kombinationen von A, B, C und 1, 2, 3 zu erstellen, sieht es bei normalen for-Schleifen so aus.

letters = ["A", "B", "C"]
numbers = [1, 2, 3]
combinations = []

for letter in letters:
    for number in numbers:
        combinations.append(f"{letter}{number}")

print(combinations)  
# ['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']

Mit List Comprehension kann es knapp beschrieben werden.

letters = ["A", "B", "C"]
numbers = [1, 2, 3]
combinations = [f"{letter}{number}" for letter in letters for number in numbers]

print(combinations)  
# ['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']

Das Schreiben von mehrfachen Schleifen in einer Zeile ist die Stärke der verschachtelten List Comprehensions.

Kombinieren mit Bedingungsverzweigungen

Auch bei verschachtelten List Comprehensions können Bedingungsverzweigungen mit if oder if-else integriert werden.

3. Nur Paare mit gerader Summe abrufen

Zum Beispiel, unter den Kombinationen von 1-3 und 4-6 nur die Paare, deren Summe gerade ist abrufen, sieht es bei normalen for-Schleifen so aus.

list1 = [1, 2, 3]
list2 = [4, 5, 6]
pairs = []

for x in list1:
    for y in list2:
        if (x + y) % 2 == 0:
            pairs.append((x, y))

print(pairs)  
# [(1, 5), (2, 4), (2, 6), (3, 5)]

Mit List Comprehension wird es kürzer und intuitiver zu schreiben.

list1 = [1, 2, 3]
list2 = [4, 5, 6]
pairs = [(x, y) for x in list1 for y in list2 if (x + y) % 2 == 0]

print(pairs)  
# [(1, 5), (2, 4), (2, 6), (3, 5)]

Hinweise beim Verwenden verschachtelter List Comprehensions

1. Die Lesbarkeit nimmt leicht ab

  • Bei tiefer Verschachtelung sinkt die Lesbarkeit, daher übermäßigen Gebrauch vermeiden
  • Bei Priorisierung der Lesbarkeit normale for-Schleifen verwenden

2. Auf die Position von if achten

  • if nur verwenden → nach dem for
  • if-else verwenden → vor dem for

3. Bei zu komplexer Verschachtelung Funktionen verwenden

  • Bei tiefer Verschachtelung und sinkender Lesbarkeit ist es eine Methode, List Comprehensions zu vermeiden und in Funktionen aufzuteilen.

Zusammenfassung

  • Mit verschachtelten List Comprehensions können 2D-Listenverarbeitung und mehrfache Schleifen knapp beschrieben werden
  • Durch Kombination mit if können nur die Elemente, die die Bedingung erfüllen, extrahiert werden
  • Durch Kombination mit if-else können unterschiedliche Werte für jedes Element gesetzt werden
  • Allerdings sinkt die Lesbarkeit bei zu tiefer Verschachtelung, daher Vorsicht

6. Best Practices und Hinweise zur List Comprehension

Die List Comprehension ist eine bequeme Funktion, um Python-Code kurz zu schreiben, aber je nach Verwendung kann die Lesbarkeit abnehmen oder die Verarbeitungsgeschwindigkeit verschlechtern.
Dieser Abschnitt erläutert Best Practices und Hinweise zur angemessenen Nutzung der List Comprehension.

Fälle, in denen List Comprehensions verwendet werden sollten

Die List Comprehension eignet sich für Fälle wie die folgenden.

1. Einfache Listen-Erstellung

Die List Comprehension ermöglicht es, Listen einfach zu erstellen, und ist daher sehr geeignet für die Verarbeitung, bei der Elemente einfach umgewandelt oder extrahiert werden.Beispiel: Jedes Element quadrieren

squares = [x**2 for x in range(10)]
print(squares)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

2. Bedingte Listen-Erstellung (Filterung)

Die List Comprehension eignet sich auch für Fälle, in denen nur Elemente extrahiert werden, die eine bestimmte Bedingung erfüllen.Beispiel: Nur gerade Zahlen extrahieren

evens = [x for x in range(10) if x % 2 == 0]
print(evens)  # [0, 2, 4, 6, 8]

3. Umwandlung von String-Listen

Die List Comprehension ist auch praktisch, wenn Listen von Strings umgewandelt werden.Beispiel: Alle Strings in Großbuchstaben umwandeln

words = ["python", "list", "comprehension"]
uppercase_words = [word.upper() for word in words]
print(uppercase_words)  # ['PYTHON', 'LIST', 'COMPREHENSION']

4. Flachmachen verschachtelter Listen

Sie ist auch nützlich zum Umwandeln einer zweidimensionalen Liste in eine eindimensionale.Beispiel: Elemente einer zweidimensionalen Liste flachmachen

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
print(flattened)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

Fälle, in denen List Comprehensions nicht verwendet werden sollten

Die List Comprehension ist praktisch, aber es gibt auch ungeeignete Fälle.

1. Bei tiefer Verschachtelung nimmt die Lesbarkeit ab

Die List Comprehension macht einfache Verarbeitungen lesbarer, aber bei mehrfachen Schleifen nimmt die Lesbarkeit ab.❌ Schlechtes Beispiel: List Comprehension mit mehrfachen Schleifen

matrix = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
flattened = [num for row in matrix for subrow in row for num in subrow]

👉Zu tief verschachtelt und unverständlich✅ Verbesserung: Normale for-Schleife verwenden

flattened = []
for row in matrix:
    for subrow in row:
        for num in subrow:
            flattened.append(num)

2. Bei zu langer Verarbeitung verschlechtert sich die Lesbarkeit

Der Vorteil der List Comprehension ist, dass sie in einer Zeile einfach geschrieben werden kann, aber bei komplexer Verarbeitung wird sie stattdessen unlesbar.❌ Schlechtes Beispiel: List Comprehension mit komplizierten Bedingungen

numbers = [x**2 if x % 2 == 0 else x**3 for x in range(10) if x != 5 and x % 3 != 0]

👉Die Bedingungen sind zu kompliziert und unlesbar✅ Verbesserung: for-Schleife verwenden

numbers = []
for x in range(10):
    if x != 5 and x % 3 != 0:
        if x % 2 == 0:
            numbers.append(x**2)
        else:
            numbers.append(x**3)

Leistung der List Comprehension

1. for-Schleife im Vergleich: Schnellere Verarbeitung

Die List Comprehension ist im Allgemeinen schneller als die for-Schleife.
Durch die interne Optimierung von Python wird die Listen-Erstellung effizient durchgeführt.Vergleich der Geschwindigkeit: for-Schleife vs. List Comprehension

import time

# Vergleich mit großen Datenmengen
data = list(range(10**6))

# List Comprehension
start = time.time()
squares = [x**2 for x in data]
print("List Comprehension:", time.time() - start)

# Normale for-Schleife
start = time.time()
squares = []
for x in data:
    squares.append(x**2)
print("Normale for-Schleife:", time.time() - start)

Ergebnis

  • Die List Comprehension ist tendenziell schneller
  • Allerdings wird die gesamte Liste im Speicher gespeichert, sodass bei großen Datenmengen der Speicherverbrauch zunimmt

2. Bei Berücksichtigung der Speichereffizienz Generator-Ausdrücke nutzen

Bei der Verarbeitung großer Datenmengen kann statt der List Comprehension ein „Generator-Ausdruck“ verwendet werden, um den Speicherverbrauch zu reduzieren.

# List Comprehension (verbraucht viel Speicher)
squares = [x**2 for x in range(10**6)]

# Generator-Ausdruck (speichereffizient)
squares_gen = (x**2 for x in range(10**6))

squares_gen erstellt keine Liste, sondern gibt einen Iterator zurück, wodurch Speicher gespart wird.

Zusammenfassung

Fälle, in denen List Comprehensions verwendet werden sollten

  • Einfache Listen-Erstellung
  • Filterung
  • Umwandlung von Strings
  • Flachmachen zweidimensionaler Listen

Fälle, in denen List Comprehensions vermieden werden sollten

  • Verarbeitungen mit tiefer Verschachtelung
  • Verarbeitungen mit zu komplexen Bedingungen
  • Fälle, in denen die Lesbarkeit extrem abnimmt

💡Best Practices

  • Bei einfachen Verarbeitungen List Comprehension verwenden
  • Bei komplexen Verarbeitungen normale for-Schleife verwenden
  • Angemessen auswählen unter Berücksichtigung der Leistung

7. Häufig gestellte Fragen (FAQ)

Dieser Abschnitt erklärt detailliert häufige Fragen zur List Comprehension und Punkte, auf die man beim tatsächlichen Entwickeln achten sollte. Er umfasst auch Punkte, die Anfänger leicht falsch machen, sowie Fragen zur Leistung.

Q1. Ist bedingtes Filtern mit if zweimal möglich?

A1. Ja, es ist möglich, aber achte auf die Lesbarkeit.

In der List Comprehension kann man durch mehrmaliges Verwenden von if komplexe Bedingungen spezifizieren.Beispiel: Extrahiere nur Zahlen, die zwei Bedingungen erfüllen (gerade und Vielfaches von 3)

filtered_numbers = [x for x in range(30) if x % 2 == 0 if x % 3 == 0]
print(filtered_numbers)  # [0, 6, 12, 18, 24]

Auf diese Weise wirkt das kontinuierliche Schreiben von if wie eine „AND-Bedingung“.

Allerdings ist es aus Lesbarkeitsgründen klarer, and zu verwenden.

filtered_numbers = [x for x in range(30) if x % 2 == 0 and x % 3 == 0]

Q2. Sollte man List Comprehension oder die normale for-Schleife verwenden?

A2. Wähle basierend auf der Einfachheit der Verarbeitung und der Lesbarkeit.

Die List Comprehension ist bei einfachen Verarbeitungen sehr nützlich, aber bei komplexen Verarbeitungen kann die Lesbarkeit abnehmen.Beispiel: Fall, in dem die normale for-Schleife verwendet werden sollte

# ❌ Die List Comprehension ist schwer lesbar
numbers = ["Gerade" if x % 2 == 0 else "Ungerade" if x % 3 == 0 else "Anderes" for x in range(10)]

# ✅ Die normale `for`-Schleife ist klarer
numbers = []
for x in range(10):
    if x % 2 == 0:
        numbers.append("Gerade")
    elif x % 3 == 0:
        numbers.append("Ungerade")
    else:
        numbers.append("Anderes")

Q3. Was ist der Unterschied zwischen der Verwendung von if-else und nur if?

A3. Nur if dient zum Filtern, if-else zur Werteumwandlung.

✅ Nur if (nur Elemente, die die Bedingung erfüllen, werden übernommen)

evens = [x for x in range(10) if x % 2 == 0]
print(evens)  # [0, 2, 4, 6, 8]

→ Extrahiere nur gerade Zahlen, Elemente, die die Bedingung nicht erfüllen, werden nicht in die Liste aufgenommenif-else (verschiedene Werte je nach Bedingung speichern)

labels = ["gerade" if x % 2 == 0 else "ungerade" for x in range(10)]
print(labels)  
# ['gerade', 'ungerade', 'gerade', 'ungerade', 'gerade', 'ungerade', 'gerade', 'ungerade', 'gerade', 'ungerade']

Q4. Ist die List Comprehension schneller als die for-Schleife?

A4. Im Allgemeinen ja, aber achte auf den Speicherverbrauch.

Die List Comprehension in Python ist intern optimiert und läuft daher normalerweise schneller als die normale for-Schleife.⏳ Experiment: Verarbeite 1 Million Datensätze

import time

data = list(range(10**6))

# List Comprehension
start = time.time()
squares = [x**2 for x in data]
print("List Comprehension:", time.time() - start)

# Normale for-Schleife
start = time.time()
squares = []
for x in data:
    squares.append(x**2)
print("Normale for-Schleife:", time.time() - start)

Ergebnis

  • Die List Comprehension ist oft etwa 30 % bis 50 % schneller
  • Allerdings wird die gesamte Liste im Speicher gespeichert, daher steigt der Speicherverbrauch bei großen Datenmengen

Verbesserungsvorschlag (Generator verwenden)Bei großen Datenmengen kann man anstelle der List Comprehension eine „Generator-Ausdruck“ verwenden, um den Speicherverbrauch zu reduzieren.

squares_gen = (x**2 for x in data)  # () macht es zu einem Generator

Q5. Gibt es auch Comprehension für set oder dict?

A5. Ja, es gibt Comprehension nicht nur für Listen, sondern auch für set (Mengen) und dict (Wörterbücher).

set (Menge) Comprehension

unique_squares = {x**2 for x in range(10)}
print(unique_squares)

dict (Wörterbuch) Comprehension

squares_dict = {x: x**2 for x in range(10)}
print(squares_dict)

Zusammenfassung

  • Es ist möglich, if zweimal zu verwenden, aber and sorgt für bessere Lesbarkeit
  • if-else dient der Werteumwandlung, nur if dem Filtern
  • Die List Comprehension ist schneller als die for-Schleife, aber bei großen Daten achte auf den Speicherverbrauch
  • Es gibt auch Comprehension für set und dict

Diese Erklärung zur Kombination von Pythons List Comprehension und if ist nun abgeschlossen! 🎉
Probiere es gerne aus, indem du Code schreibst, und beherrsche die List Comprehension! 🚀