web-dev-qa-db-fra.com

Comment initialiser un dict avec les clés d'une liste et une valeur vide en Python?

Je voudrais tirer de ceci:

keys = [1,2,3]

pour ça:

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

Y a-t-il une façon de le faire pythonique?

C'est une façon laide de le faire:

>>> keys = [1,2,3]
>>> dict([(1,2)])
{1: 2}
>>> dict(Zip(keys, [None]*len(keys)))
{1: None, 2: None, 3: None}
181
Juanjo Conti

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

C'est en fait une méthode de classe, donc ça marche aussi pour les sous-classes dict (comme collections.defaultdict). Le deuxième argument facultatif spécifie la valeur à utiliser pour les clés (par défaut, None.)

341
Thomas Wouters

personne ne s'est soucié de donner une solution de dict-compréhension?

>>> 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}
195
Adrien Plisson
dict.fromkeys(keys, None)
52
Dominic Cooney
>>> keyDict = {"a","b","c","d"}

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

Sortie:

{'a': [], 'c': [], 'b': [], 'd': []}
11
Mayur Koshti
d = {}
for i in keys:
    d[i] = None
7
inspectorG4dget

Dans les flux de travaux many dans lesquels vous souhaitez associer une valeur par défaut/initiale pour des clés arbitraires, vous n'avez pas besoin de need pour hacher chaque clé individuellement à l'avance. Vous pouvez utiliser collections.defaultdict . Par exemple:

from collections import defaultdict

d = defaultdict(lambda: None)

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

C'est plus efficace, cela évite d'avoir à hacher toutes vos clés lors de l'instanciation. De plus, defaultdict est une sous-classe de dict, il n'est donc généralement pas nécessaire de reconvertir en dictionnaire.

Pour les workflows où vous avez besoin de commandes sur les touches autorisées, vous pouvez utiliser dict.fromkeys selon la réponse acceptée:

d = dict.fromkeys([1, 2, 3, 4])
0
jpp