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.
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.
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))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
Dowiedz się, jak używać wyrażeń listowych w Pythonie. Twórz zwięzłe pętle, stosuj filtry warunkowe i buduj macierze z przejrzystą składnią wizualną.
Jak pokroić listę w PythonieDowiedz się, jak dzielić listy w Pythonie, korzystając z zaawansowanej składni nawiasów. Opanuj argumenty startu, stopu i kroku, indeksowanie ujemne i listy odwracania.
Polecane zasoby Pythona
Poszerzaj swoją wiedzę dzięki powiązanym interaktywnym samouczkom, ściągawkom i porównaniom kodów.
Wyjaśnienie zmiennych i typów danych w Pythonie
Zrozumienie zmiennych Pythona i podstawowych typów danych (łańcuchy, liczby całkowite, zmiennoprzecinkowe, wartości logiczne). Kompletny przewodnik dla początkujących dotyczący przydzielania pamięci w Pythonie.
Ściągawka dotycząca metod listy Pythona
Skrócona instrukcja obsługi operacji na listach w języku Python. Opanuj dodawanie, wstawianie, usuwanie, sortowanie i cięcie elementów.
Python kontra JavaScript: który język programowania jest najlepszy?
Kompleksowe porównanie Pythona i JavaScript. Poznaj różnice w składni, wydajność, przypadki użycia (backend vs frontend) i przykłady kodowania.