Jak spłaszczyć listę list w Pythonie

Dowiedz się, jak spłaszczyć listę list w Pythonie. Porównaj wyrażenia list zagnieżdżonych, itertools.chain, sum i metody rekurencyjne z przykładami kodu.

Wypróbuj to rozwiązanie w Edytorze

Przegląd

Podczas pracy z obliczeniami macierzy, wierszami bazy danych lub analizowanymi drzewami danych często można spotkać zagnieżdżone struktury, takie jak lista list: `[[1, 2], [3, 4]]`. Spłaszczenie tej struktury oznacza przekształcenie jej w jednowymiarową listę zawierającą wszystkie poszczególne elementy: `[1, 2, 3, 4]`. Python oferuje kilka eleganckich sposobów osiągnięcia tego celu.

Najbardziej powszechnym i Pythonicznym sposobem spłaszczenia listy list jest użycie zagnieżdżonego rozumienia listy: `[element dla podlisty w macierzy dla elementu w podliście]`. Chociaż składnia może na początku wyglądać nieco sprzecznie z intuicją, ponieważ pętle są zapisywane w tej samej kolejności, co zagnieżdżona pętla „for”, jest ona wysoce zoptymalizowana, szybka i nie wymaga importowania bibliotek zewnętrznych.

Alternatywnie możesz użyć funkcji `chain.from_iterable()` modułu `itertools`. Jest to podejście najbardziej oszczędzające pamięć, ponieważ zwraca iterator, który leniwie generuje elementy, zamiast natychmiastowo alokować nową listę w pamięci. W przypadku list głęboko zagnieżdżonych (o dowolnej głębokości) należy napisać funkcję generatora rekurencyjnego, aby rozpakować wszystkie poziomy.

Dane wyjściowe kodu i wykonania

Ten skrypt demonstruje spłaszczanie listy list przy użyciu wyrażeń list, itertools.chain i rozpakowywania rekurencyjnego.

flatten_list.py
Spróbuj w Edytorze
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))
Wyjście terminala
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]

Wdrażanie krok po kroku

  • Użyj rozumienia listy zagnieżdżonej [element dla podlisty na liście zagnieżdżonej dla elementu na podliście] dla płaskich struktur 2D.
  • Zaimportuj itertools i wywołaj itertools.chain.from_iterable(nested_list), aby uzyskać leniwą, przyjazną dla pamięci ocenę.
  • Zdefiniuj funkcję rekurencyjną sprawdzającą isinstance(element, lista) w celu obsługi dowolnie zagnieżdżonych kolekcji.

Często zadawane pytania

Czy mogę używać funkcji sum() do spłaszczania list?

Tak, sum(matrix, []) będzie działać, ale jest to wysoce odradzane. Działa ze złożonością O(N^2), ponieważ tworzy nową kopię listy przy każdym dodaniu, co powoduje straszną wydajność w przypadku dużych zbiorów danych.

Jaka jest najszybsza metoda spłaszczania list list?

itertools.chain.from_iterable() jest zwykle najszybszą metodą, zaraz po niej następują wyrażenia list zagnieżdżonych.

Powiązane tematy

Polecane zasoby Pythona

Poszerzaj swoją wiedzę dzięki powiązanym interaktywnym samouczkom, ściągawkom i porównaniom kodów.