Comment puis-je fusionner les dictionnaires ensemble en Python?
d3 = dict(d1, **d2)
Je comprends que cela fusionne le dictionnaire. Mais, est-il unique? Si d1 est la même touche que d2, mais différente de la valeur? Je voudrais d1 et d2 à être fusionnés, mais d1 a priorité si il y a double de la clé.
- S'il vous plaît être conscient que cette astuce est considéré comme un abus de
**
argument mot-clé de passage, à moins que toutes les clés ded2
sont des chaînes de caractères. Si pas toutes les clés ded2
sont des chaînes de caractères, il échoue en Python 3.2, et dans d'autres implémentations de Python comme Jython, IronPython et PyPy. Voir, par exemple, mail.python.org/pipermail/python-dev/2010-April/099459.html . - double possible de Comment puis-je fusionner les deux dictionnaires Python dans une expression unique?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le
.mise à jour()
méthode si vous n'avez pas besoin de l'original ded2
plus:E. g.:
Mise à jour:
Bien sûr, vous pouvez copier le dictionnaire abord, afin de créer un nouveau fusionné un. Cela peut ou peut ne pas être nécessaire. Dans le cas où vous avez composé d'objets (les objets qui contiennent d'autres objets, comme des listes ou des instances de classe) dans votre dictionnaire,
copier.propriétédeepcopy
devrait également être envisagée.isinstance(int, object) is True
encoredeepcopy
ne me semble pas nécessaire.copy.deepcopy
. @AntonyHatchkinsint
etstr
, bien que techniquementobjects
, ont généralement vrai copies, mais d'autres objets (list
,dict
, toutes les classes définies par l'utilisateur, etc) n'ont peu profonde copies réalisées à moins quedeepcopy
est appelé. Jusqu'à l'utilisateur et le scénario qui est préféré (shallow-vs-profondeur).copy.deepcopy
devrait également être envisagée." la partie est incorrecte et doit être reformulée.deepcopy
, en fonction de vos besoins. C'est tout à fait valide et approprié de mentionner ici. Peut-être vous voulez dire "dans le cas où vous avez des objets plus complexes [...]"?En Python2,
d1 remplace d2:
d2 remplace d1:
Ce comportement n'est pas juste un coup de chance de la mise en œuvre; il est garanti dans la documentation:
**
notation, toutes les clés de cette dict doivent être des chaînes de caractères. Voir le python-dev fil de départ à mail.python.org/pipermail/python-dev/2010-April/099427.html pour plus d'.d = dict(**d1, **d2)
fonctionne, mais c'est ce que @IoannisFilippidis références dans leurs commentaire. Peut-être, y compris l'extrait ici aurait été plus claire, si elle est ici.Si vous voulez
d1
avoir la priorité dans les conflits, à faire:Sinon, inverser
d2
etd1
.Ma solution est de définir une de fusion fonction. Ce n'est pas sophistiqué et le coût d'une ligne. Voici le code en Python 3.
Tests
Il travaille pour un nombre arbitraire de dictionnaire des arguments. Y avait-il des doubles de clés dans ceux du dictionnaire, la clé à partir de la droite du dictionnaire dans la liste d'arguments gagne.
.update
appel à elle (merged={}
suivie parfor d in dict: merged.update(d)
) serait plus court, plus lisible et plus efficace.reduce
etlambda
s, comment surreturn reduce(lambda x, y: x.update(y) or x, dicts, {})
?Trey Hunner a un beau post de blog exposant plusieurs options pour la fusion de plusieurs dictionnaires, y compris (pour python3.3+) ChainMap et dictionnaire déballage.
Je crois que, comme indiqué ci-dessus, à l'aide de
d2.update(d1)
est la meilleure approche, et que vous pouvez également copierd2
d'abord si vous avez encore besoin d'elle.Bien, je tiens à souligner que
dict(d1, **d2)
est en fait une mauvaise façon de fusionner dictionnaries en général, puisque le mot clé les arguments doivent être des chaînes de caractères, donc il va échouer si vous avez undict
tels que: