120 votes

Ajouter des dictionnaires ensemble, Python

J'ai deux dictionnaires et j'aimerais pouvoir en faire un seul :

Quelque chose comme ce pseudo-Python serait bien :

dic0 = {'dic0': 0}
dic1 = {'dic1': 1}

ndic = dic0 + dic1
# ndic would equal {'dic0': 0, 'dic1': 1}

6 votes

J'aimerais savoir pourquoi Python ne le permet pas. Il me semble logique qu'il effectue une opération non-commutative qui donne lieu à une nouvelle instance de dict. Mais je rate probablement quelque chose d'évident...

1 votes

@Sam Problème possible : {'dic0':0} + {'dic0':1}. Que faire ?

3 votes

@palsch {'dic0':0} + {'dic0':1} devrait être équivalent à d={'dic0':0} ; d.update({'dic0':1}) ?

194voto

bluepnume Points 3587

Si vous souhaitez créer un nouveau dict sans utiliser de stockage intermédiaire : (c'est plus rapide et, à mon avis, plus propre que d'utiliser la fonction dict.items() )

dic2 = dict(dic0, **dic1)

Ou si vous êtes heureux d'utiliser l'un des dicts existants :

dic0.update(dic1)

16 votes

Bonne réponse, mais tellement peu intuitive. j'aimerais que le '+' soit implémenté...

3 votes

7 votes

La première ligne échoue si les clés ne sont pas des chaînes de caractères.

17voto

Vijay Points 485
>>> dic0 = {'dic0':0}
>>> dic1 = {'dic1':1}
>>> ndic = dict(dic0.items() + dic1.items())
>>> ndic
{'dic0': 0, 'dic1': 1}
>>>

2 votes

Notez que la syntaxe équivalente dans Python 3.x est la suivante ndic = list(dict(dic0.items()) + list(dic1.items())) depuis .items() ne renvoie plus une liste, mais une vue (itérable)

2 votes

@BryceGuinta je suppose que vous vouliez dire ndic = dict(list(dic0.items()) + list(dic1.items()))

1 votes

@dimo414 Oui, c'est ma faute. Je ne peux cependant pas le changer maintenant. J'utilise Carte de la chaîne de collections pour réaliser cette fonctionnalité maintenant via dict(ChainMap(dic1, dic0)) . Cependant, j'ai dû récupérer le code source à partir de le paquet pypi de chainmap pour Python2.7. Remarquez comment j'ai interverti l'ordre des dicts. Dans l'exemple de Vijay, les valeurs des clés les plus à droite écrasent les plus à gauche, alors que ChainMap a raison et les valeurs des clés les plus à gauche ont la priorité sur celles de droite.

13voto

Mark Points 21191

Vous êtes à la recherche de la méthode de mise à jour

dic0.update( dic1 )
print( dic0 ) 

donne

{'dic0': 0, 'dic1': 1}

7 votes

Joli, bien qu'il modifie dic0. Je ne suis pas sûr que cela soit acceptable pour le posteur original.

6voto

Daniel Roseman Points 199743
dic0.update(dic1)

Notez que cela ne retourne pas réellement le dictionnaire combiné, cela ne fait que muter dic0 .

5voto

LukeFitz Points 96

La façon la plus simple de le faire est d'utiliser simplement votre code d'exemple, mais en utilisant le membre items() de chaque dictionnaire. Ainsi, le code serait le suivant

dic0 = {'dic0': 0}
dic1 = {'dic1': 1}
dic2 = dict(dic0.items() + dic1.items())

Je l'ai testé dans IDLE et cela fonctionne bien. Cependant, la question précédente sur ce sujet indique que cette méthode est lente et consomme de la mémoire. Il y a plusieurs autres méthodes recommandées, alors consultez-les si l'utilisation de la mémoire est importante.

3 votes

Pour info, cela crée une liste de tuples, vous devrez exécuter dict(dic0.items() + dic1.items())

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X