HOWTO · Python
Come creare una lista con una dimensione specifica in Python
Questo tutorial mostra come creare una lista con una dimensione specifica in Python
In questa pagina
Usa [value] * size per creare una lista con il numero di elementi desiderato quando ogni posizione deve contenere inizialmente lo stesso valore. Per esempio, [None] * 4 crea una lista di quattro elementi. Le liste Python contengono riferimenti a oggetti: così si inizializzano quattro voci, senza riservare quattro posizioni non inizializzate. Scegli il valore iniziale in base a ciò che deve contenere ciascuna posizione.
Creare una lista di dimensione fissa
Ecco un esempio completo che crea una lista con quattro voci inizializzate a None. Il codice e le eventuali etichette o gli output visibili negli esempi restano in inglese:
size = 4
items = [None] * size
print(len(items), items)
4 [None, None, None, None]
La lista ha lunghezza size e ogni voce fa riferimento all’unica istanza di None. Puoi sostituire una voce assegnando un valore al suo indice, per esempio items[0] = "ready". Se la lista deve mantenere la stessa lunghezza, assegna valori agli indici esistenti invece di aggiungere o rimuovere elementi; le liste Python restano comunque ridimensionabili.
La ripetizione è concisa quando è sicuro condividere il valore iniziale. Fai attenzione ai valori mutabili: [[]] * 3 inserisce nella lista esterna tre riferimenti alla stessa lista interna. Di conseguenza, una modifica effettuata tramite una posizione è visibile anche dalle altre. Per creare una lista distinta in ogni posizione, usa una comprensione come [[] for _ in range(3)]. Una comprensione è utile anche quando il valore iniziale dipende dall’indice, per esempio [index * 2 for index in range(size)].
Un ciclo con append è un’altra possibilità quando la costruzione di ciascun elemento richiede più passaggi: parti da items = [], poi aggiungi un valore a ogni iterazione. Usa la ripetizione per un valore iniziale immutabile condiviso, come None; una comprensione per valori creati o calcolati separatamente; e un ciclo quando rende più chiara una costruzione articolata. Questi approcci comportano operazioni e allocazioni diverse: i vecchi tempi misurati su una macchina specifica non vanno considerati una classifica universale della velocità. Se le prestazioni sono importanti, confronta le alternative con dati rappresentativi nell’ambiente Python usato dal tuo programma. Questo script timeit ripete ogni costruzione 100 volte, riporta il risultato più rapido di tre esecuzioni e stampa i secondi per costruzione; i risultati descrivono solo quella specifica esecuzione e il relativo ambiente:
import timeit
size = 100
number = 100
cases = {
"repetition": "[None] * size",
"comprehension": "[None for _ in range(size)]",
}
for name, statement in cases.items():
runs = timeit.repeat(
statement,
globals={"size": size},
number=number,
repeat=3,
)
print(f"{name}: {min(runs) / number:.9f} seconds per construction")
Per confrontare un’attività diversa, modifica i valori, la dimensione e le espressioni di costruzione in modo che corrispondano al lavoro svolto dal tuo programma. Non considerare i tempi misurati su una singola macchina come una classifica generale.
Usare array.array per valori numerici tipizzati
Una normale lista può contenere valori di tipi diversi e memorizza riferimenti a oggetti Python. array.array, disponibile nella libreria standard, è una sequenza tipizzata pensata per valori numerici compatti di un tipo supportato. Per esempio, array('i', [0] * 4) crea quattro elementi interi; prima importa array dal modulo array. Il codice di tipo limita i valori memorizzabili, quindi non è un sostituto diretto quando una lista deve contenere oggetti di tipi diversi o valori Python generici. Sceglila quando i dati e le operazioni richieste sono adatti a una sequenza numerica tipizzata.
Usare NumPy per grandi array numerici
Per i calcoli numerici che traggono vantaggio dalle operazioni su molti valori, NumPy offre il tipo ndarray. numpy.zeros(4) crea un array inizializzato a zero, mentre numpy.empty(4) alloca un array senza inizializzarne gli elementi. I valori restituiti da empty non sono definiti: assegna un valore a ogni elemento prima di leggerlo. Non significa «creare un array riempito di zeri». NumPy è utile quando il suo modello di dati numerici e le operazioni sugli array sono adatti al compito, ma aggiunge una dipendenza e non è necessario soltanto per creare una breve lista Python.
In breve, usa [None] * size quando tutte le posizioni della lista devono fare inizialmente riferimento a None; una comprensione quando servono valori distinti o calcolati; array.array per una sequenza numerica adatta con un solo tipo; e NumPy quando sono utili le operazioni sugli array numerici. La scelta dipende dai valori e dalle operazioni richiesti dal programma, non da una soglia dimensionale fissa né dai risultati di un benchmark ottenuti in un altro ambiente.