HOWTO · Python
Come ottenere le chiavi di un dizionario come lista in Python
Scopri come ottenere le chiavi di un dizionario Python come lista con list(), cicli, list comprehension o unpacking e come distinguere una vista dict_keys da una lista.
In questa pagina
Per ottenere le chiavi di un dizionario Python come lista, usa list(my_dict). Anche list(my_dict.keys()) produce la stessa lista: in entrambi i casi il costruttore list() raccoglie le chiavi in un nuovo oggetto. Il solo metodo my_dict.keys() restituisce invece una vista dict_keys: puoi iterarla, ma non accedere ai suoi elementi tramite un indice come faresti con una lista. Converti le chiavi quando ti serve effettivamente una lista; negli altri casi, spesso basta iterare direttamente sul dizionario.
Ottenere le chiavi di un dizionario Python con dict.keys()
Il metodo dict.keys() restituisce una vista delle chiavi presenti nel dizionario. La vista riflette anche le modifiche successive, mentre una lista creata a partire da essa è una copia separata delle chiavi al momento della conversione. Da Python 3.7 in poi, l’iterazione di un dizionario segue l’ordine di inserimento; l’ordine mostrato nell’esempio presuppone questo comportamento.
state_capitals = {
"California": "Sacramento",
"Pennsylvania": "Harrisburg",
"Texas": "Austin",
}
keys_view = state_capitals.keys()
print(keys_view)
for state in keys_view:
print(state)
keys_list = list(keys_view)
print(keys_list)
print(list(state_capitals))
print(keys_list[0])
state_capitals["Nevada"] = "Carson City"
print(list(keys_view))
print(keys_list)
dict_keys(['California', 'Pennsylvania', 'Texas'])
California
Pennsylvania
Texas
['California', 'Pennsylvania', 'Texas']
['California', 'Pennsylvania', 'Texas']
California
['California', 'Pennsylvania', 'Texas', 'Nevada']
['California', 'Pennsylvania', 'Texas']
Sia list(keys_view) sia list(state_capitals) creano una lista: la seconda espressione funziona perché l’iterazione di un dizionario restituisce le sue chiavi. Tentare di indicizzare direttamente la vista genera TypeError. Se il dizionario è vuoto, la conversione restituisce []; tentare di indicizzare quella lista vuota genera IndexError.
Ottenere le chiavi di un dizionario Python con un ciclo
Un ciclo esplicito è utile se devi elaborare ogni chiave mentre la aggiungi alla lista. Scrivi for key in state_capitals: la parola chiave in è necessaria e il ciclo riceve le chiavi, non i valori.
state_capitals = {
"California": "Sacramento",
"Pennsylvania": "Harrisburg",
"Texas": "Austin",
}
keys = []
for key in state_capitals:
keys.append(key)
print(keys)
['California', 'Pennsylvania', 'Texas']
Se il dizionario è vuoto, il ciclo non viene eseguito e keys rimane vuota. Se vuoi soltanto raccogliere le chiavi, senza svolgere altre operazioni nel ciclo, list(state_capitals) è più conciso.
Ottenere le chiavi di un dizionario Python con una list comprehension
Una list comprehension esprime la stessa raccolta delle chiavi in una sola riga. Questa forma è utile se prevedi di filtrare le chiavi o trasformarle; per una semplice copia, il costruttore list() è più immediato.
state_capitals = {
"California": "Sacramento",
"Pennsylvania": "Harrisburg",
"Texas": "Austin",
}
keys = [key for key in state_capitals]
print(keys)
['California', 'Pennsylvania', 'Texas']
Anche questa list comprehension restituisce [] se il dizionario è vuoto.
Ottenere le chiavi di un dizionario Python con l’operatore di unpacking *
La sintassi di unpacking degli iterabili * permette di inserire le chiavi del dizionario in una lista: [*state_capitals]. La PEP 448 ha generalizzato l’unpacking in Python 3.5; questa indicazione di compatibilità deriva dalla specifica della sintassi, non da un’esecuzione del codice con Python 3.5. Lo stesso operatore si può usare anche per creare tuple e insiemi.
state_capitals = {
"California": "Sacramento",
"Pennsylvania": "Harrisburg",
"Texas": "Austin",
}
keys_list = [*state_capitals]
keys_tuple = (*state_capitals,)
keys_set = {*state_capitals}
print(keys_list)
print(keys_tuple)
print(sorted(keys_set))
['California', 'Pennsylvania', 'Texas']
('California', 'Pennsylvania', 'Texas')
['California', 'Pennsylvania', 'Texas']
L’insieme elimina eventuali duplicati e non garantisce un ordine di visualizzazione; sorted() rende prevedibile l’output dell’esempio. Da Python 3.7 in poi, la lista e la tupla mantengono l’ordine di iterazione del dizionario. Se ti serve una lista, usa la forma con le parentesi quadre.
Confrontare i tempi di esecuzione
Se la velocità di conversione conta, misura le prestazioni con il tuo interprete Python e con un dizionario di dimensioni simili a quello reale. Lo script mostra la versione di Python e il tempo migliore su cinque esecuzioni, ciascuna composta da 10.000 conversioni dello stesso dizionario di 100 elementi. Ogni istruzione misurata crea una nuova lista; anche il ciclo riparte ogni volta da una lista vuota.
import platform
from timeit import repeat
state_capitals = {str(number): number for number in range(100)}
methods = {
"list(d.keys())": "list(state_capitals.keys())",
"list(d)": "list(state_capitals)",
"loop": "keys = []\nfor key in state_capitals:\n keys.append(key)",
"comprehension": "[key for key in state_capitals]",
"unpacking": "[*state_capitals]",
}
print("Python", platform.python_version())
for name, statement in methods.items():
times = repeat(statement, globals=globals(), number=10_000, repeat=5)
print(f"{name}: {min(times) / 10_000:.9f} seconds per conversion")
I tempi stampati dipendono dall’interprete, dal computer e dalle dimensioni del dizionario: non esiste quindi un output numerico fisso né un metodo sempre più veloce degli altri. Nel codice ordinario, scegli list(state_capitals) per la sua chiarezza e confronta le alternative solo se la conversione incide davvero sulle prestazioni del programma.