Come appiattire un elenco di elenchi in Python
Scopri come appiattire un elenco di elenchi in Python. Confronta le comprensioni degli elenchi nidificati, itertools.chain, sum e metodi ricorsivi con esempi di codice.
Panoramica
Quando si lavora con calcoli di matrici, righe di database o alberi di dati analizzati, si incontrano spesso strutture nidificate, come un elenco di elenchi: "[[1, 2], [3, 4]]". Appiattire questa struttura significa convertirla in una lista unidimensionale contenente tutti i singoli elementi: "[1, 2, 3, 4]". Python offre diversi modi eleganti per raggiungere questo obiettivo.
Il modo più comune e pythonic per appiattire un elenco di elenchi è utilizzare una comprensione di elenchi annidati: "[elemento per sottolista nella matrice per elemento in sottolista]". Anche se all'inizio la sintassi può sembrare leggermente controintuitiva perché i cicli sono scritti nello stesso ordine di un ciclo `for` nidificato, è altamente ottimizzata, veloce e non richiede l'importazione di librerie esterne.
In alternativa, puoi utilizzare la funzione `chain.from_iterable()` del modulo `itertools`. Questo è l'approccio più efficiente in termini di memoria perché restituisce un iteratore che produce elementi pigramente anziché allocare immediatamente un nuovo elenco in memoria. Per elenchi profondamente nidificati (con profondità arbitraria), è necessario scrivere una funzione di generazione ricorsiva per decomprimere tutti i livelli.
Codice e output di esecuzione
Questo script dimostra l'appiattimento di un elenco di elenchi utilizzando la comprensione delle liste, itertools.chain e lo spacchettamento ricorsivo.
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]Implementazione passo dopo passo
- Utilizzare una comprensione dell'elenco nidificato [elemento per sottolista in nidificato_elenco per elemento in sottolista] per strutture 2D piatte.
- Importa itertools e chiama itertools.chain.from_iterable(nested_list) per una valutazione pigra e facile da usare in memoria.
- Definire una funzione ricorsiva che controlla isinstance(item, list) per gestire raccolte nidificate arbitrariamente.
Domande frequenti
Posso usare la funzione sum() per appiattire le liste?
Sì, sum(matrix, []) funzionerà, ma è altamente sconsigliato. Funziona con una complessità O (N ^ 2) perché crea una nuova copia dell'elenco a ogni aggiunta, causando prestazioni terribili per set di dati di grandi dimensioni.
Qual è il metodo più veloce per appiattire elenchi di elenchi?
itertools.chain.from_iterable() è solitamente il più veloce, seguito da vicino dalle comprensioni di elenchi nidificati.
Argomenti correlati
Scopri come utilizzare la comprensione delle liste in Python. Scrivi loop concisi, applica filtri condizionali e crea matrici con una sintassi visiva pulita.
Come suddividere una lista in PythonScopri come suddividere gli elenchi in Python utilizzando la potente sintassi delle parentesi. Argomenti principali di avvio, arresto e passaggio, indicizzazione negativa ed elenchi di inversione.
Risorse Python consigliate
Espandi le tue conoscenze con tutorial interattivi, foglietti illustrativi e confronti di codici correlati.
Spiegazione delle variabili Python e dei tipi di dati
Comprendere le variabili Python e i tipi di dati principali (stringhe, numeri interi, float, booleani). Una guida completa per principianti all'assegnazione della memoria in Python.
Foglio informativo sui metodi dell'elenco Python
Guida di riferimento rapido per le operazioni sugli elenchi Python. Impara ad aggiungere, inserire, rimuovere, ordinare e affettare gli elementi.
Python vs JavaScript: quale linguaggio di programmazione è il migliore?
Un confronto completo tra Python e JavaScript. Esplora le differenze di sintassi, le prestazioni, i casi d'uso (backend e frontend) ed esempi di codifica.