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.

Prova questa soluzione nell'editor

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.

flatten_list.py
Prova nell'editor
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))
Uscita terminale
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

Risorse Python consigliate

Espandi le tue conoscenze con tutorial interattivi, foglietti illustrativi e confronti di codici correlati.