Come inizializzare un dict con le chiavi di un elenco e il valore vuoto in Python?


251

Vorrei ottenere da questo:

keys = [1,2,3]

a questa:

{1: None, 2: None, 3: None}

C'è un modo pitonico di farlo?

Questo è un brutto modo di farlo:

>>> keys = [1,2,3]
>>> dict([(1,2)])
{1: 2}
>>> dict(zip(keys, [None]*len(keys)))
{1: None, 2: None, 3: None}

Risposte:


390

dict.fromkeys([1, 2, 3, 4])

Questo è in realtà un metodo di classe, quindi funziona anche per sottoclassi dict (come collections.defaultdict). Il secondo argomento facoltativo specifica il valore da utilizzare per le chiavi (predefinito su None.)


154
Fai attenzione all'inizializzazione di qualcosa di mutabile: se chiami, ad esempio, dict.fromkeys([1, 2, 3], [])tutti i tasti vengono mappati sullo stesso elenco e modificandone uno li modificherai tutti.
charleslparker,

8
L'inizializzazione con {k:[] for k in [1, 2, 3]}è comunque sicura.
Aziz Alto,

263

a nessuno importava dare una soluzione di comprensione del dettato?

>>> keys = [1,2,3,5,6,7]
>>> {key: None for key in keys}
{1: None, 2: None, 3: None, 5: None, 6: None, 7: None}

32
Credo che sia stato riportato in backport a 2.7
mercoledì

21
Questo è carino e non soffre del problema di riferimento che fa la risposta accettata.
charleslparker,

Ciò consente anche di assegnare un valore predefinito (ad es False.).
Neverendingqs

Questo è il modo più pulito e più pitone di Python3 IMO
Bede Constantinides,

4
L'uso di un dict-comp consente anche al valore di essere il risultato della chiamata di una funzione (che può essere passata alla chiave come argomento, se lo si desidera) - quindi è un meccanismo molto potente.
martineau,


16
>>> keyDict = {"a","b","c","d"}

>>> dict([(key, []) for key in keyDict])

Produzione:

{'a': [], 'c': [], 'b': [], 'd': []}

1
Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo riguardo a come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta.
Francesco Menzani,

4
il nome keyDictè fuorviante, poiché la prima riga di codice restituisce a set, non a dict.
Bryan Oakley,

10
d = {}
for i in keys:
    d[i] = None

1
Perché Python emette un errore del tipo TypeError: 'type' object is not iterable:?
FaCoffee,

1
@FrancescoCastellani Perché listè un tipo. A meno che tu non abbia qualcosa del genere list = [], il metodo sopra ti darà sempre lo stesso errore
smac89

1

In molti flussi di lavoro in cui si desidera associare un valore predefinito / iniziale per chiavi arbitrarie, non è necessario eseguire l'hashing di ciascuna chiave singolarmente in anticipo. È possibile utilizzare collections.defaultdict. Per esempio:

from collections import defaultdict

d = defaultdict(lambda: None)

print(d[1])  # None
print(d[2])  # None
print(d[3])  # None

Questo è più efficiente, evita di dover eseguire l'hashing di tutte le chiavi all'istanza. Inoltre, defaultdictè una sottoclasse di dict, quindi di solito non è necessario riconvertire in un dizionario normale.

Per i flussi di lavoro in cui sono richiesti controlli sui tasti consentiti, è possibile utilizzare dict.fromkeyssecondo la risposta accettata:

d = dict.fromkeys([1, 2, 3, 4])
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.