So reduzieren Sie eine Liste von Listen in Python

Erfahren Sie, wie Sie eine Liste von Listen in Python reduzieren. Vergleichen Sie verschachtelte Listenverständnisse, itertools.chain, sum und rekursive Methoden mit Codebeispielen.

Probieren Sie diese Lösung im Editor aus

Übersicht

Wenn Sie mit Matrixberechnungen, Datenbankzeilen oder analysierten Datenbäumen arbeiten, werden Sie häufig auf verschachtelte Strukturen stoßen, z. B. eine Liste von Listen: „[[1, 2], [3, 4]]“. Diese Struktur zu verflachen bedeutet, sie in eine eindimensionale Liste umzuwandeln, die alle einzelnen Elemente enthält: „[1, 2, 3, 4]“. Python bietet mehrere elegante Möglichkeiten, dies zu erreichen.

Die gebräuchlichste und pythonischste Methode zum Reduzieren einer Liste von Listen ist die Verwendung eines verschachtelten Listenverständnisses: „[Element für Unterliste in Matrix für Element in Unterliste]“. Während die Syntax auf den ersten Blick etwas kontraintuitiv erscheinen kann, da die Schleifen in der gleichen Reihenfolge wie eine verschachtelte „for“-Schleife geschrieben werden, ist sie hochoptimiert, schnell und erfordert keinen Import externer Bibliotheken.

Alternativ können Sie die Funktion „chain.from_iterable()“ des Moduls „itertools“ verwenden. Dies ist der speichereffizienteste Ansatz, da er einen Iterator zurückgibt, der Elemente langsam liefert, anstatt sofort eine neue Liste im Speicher zuzuweisen. Für tief verschachtelte Listen (mit beliebiger Tiefe) müssen Sie eine rekursive Generatorfunktion schreiben, um alle Ebenen zu entpacken.

Code- und Ausführungsausgabe

Dieses Skript demonstriert das Reduzieren einer Liste von Listen mithilfe von Listenverständnis, itertools.chain und rekursivem Entpacken.

import itertools

matrix = [[1, 2, 3], [4, 5], [6, 7, 8]]

# Method 1: List comprehension (Pythonic and fast)
flat_comp = [item for sublist in matrix for item in sublist]
print("List comprehension:", flat_comp)

# Method 2: itertools.chain (Highly memory efficient)
flat_chain = list(itertools.chain.from_iterable(matrix))
print("itertools.chain:", flat_chain)

# Method 3: Recursive function for deep/irregular nesting
irregular = [1, [2, 3], [[4, 5], 6]]

def flatten_deep(items):
    result = []
    for item in items:
        if isinstance(item, list):
            result.extend(flatten_deep(item))
        else:
            result.append(item)
    return result

print("Deep flatten:", flatten_deep(irregular))
Terminal-Ausgabe
List comprehension: [1, 2, 3, 4, 5, 6, 7, 8]
itertools.chain: [1, 2, 3, 4, 5, 6, 7, 8]
Deep flatten: [1, 2, 3, 4, 5, 6]

Schrittweise Umsetzung

  • Verwenden Sie ein verschachteltes Listenverständnis [Element für Unterliste in verschachtelter_Liste für Element in Unterliste] für flache 2D-Strukturen.
  • Importieren Sie itertools und rufen Sie itertools.chain.from_iterable(nested_list) für eine verzögerte, speicherfreundliche Auswertung auf.
  • Definieren Sie eine rekursive Funktion, die isinstance(item, list) überprüft, um beliebig verschachtelte Sammlungen zu verarbeiten.

Häufig gestellte Fragen

Kann ich die Funktion sum() verwenden, um Listen zu reduzieren?

Ja, sum(matrix, []) wird funktionieren, aber davon wird dringend abgeraten. Es wird mit der Komplexität O(N^2) ausgeführt, da bei jedem Hinzufügen eine neue Listenkopie erstellt wird, was bei großen Datensätzen zu einer schlechten Leistung führt.

Was ist die schnellste Methode, Listenlisten zu reduzieren?

itertools.chain.from_iterable() ist normalerweise am schnellsten, dicht gefolgt von verschachtelten Listenverständnissen.

Verwandte Themen

Empfohlene Python-Ressourcen

Erweitern Sie Ihr Wissen mit zugehörigen interaktiven Tutorials, Spickzetteln und Codevergleichen.