d3 = dict(d1, **d2)
Je comprends que cela fusionne le dictionnaire. Mais est-ce unique? Et si d1 a la même clé que d2 mais une valeur différente? Je voudrais que d1 et d2 soient fusionnés, mais d1 a la priorité s'il y a une clé en double.
python
dictionary
TIMEX
la source
la source
**
passage d'arguments de mot - clé à moins que toutes les clés ded2
soient des chaînes. Si toutes les clés de ned2
sont pas des chaînes, cela échoue dans Python 3.2 et dans des implémentations alternatives de Python telles que Jython, IronPython et PyPy. Voir, par exemple, mail.python.org/pipermail/python-dev/2010-April/099459.html .Réponses:
Vous pouvez utiliser la
.update()
méthode si vous n'avez plus besoin de l'originald2
:Par exemple:
Mettre à jour:
Bien sûr, vous pouvez d'abord copier le dictionnaire afin d'en créer un nouveau fusionné. Cela peut être nécessaire ou non. Dans le cas où vous avez des objets composés (objets qui contiennent d'autres objets, comme des listes ou des instances de classe) dans votre dictionnaire,
copy.deepcopy
doivent également être pris en compte.la source
isinstance(int, object) is True
pourtantdeepcopy
cela ne semble pas nécessaire.En Python2,
d1 remplace d2:
d2 remplace d1:
Ce comportement n'est pas simplement un hasard de mise en œuvre; il est garanti dans la documentation :
la source
**
notation, toutes les clés de ce dict doivent être des chaînes. Pour en savoir plus, consultez le fil de discussion python-dev à partir de mail.python.org/pipermail/python-dev/2010-April/099427.html .d = dict(**d1, **d2)
marche, mais c'est ce que @IoannisFilippidis fait référence dans son commentaire. Peut-être que l'inclusion de l'extrait ici aurait été plus claire, alors la voici.Si vous voulez
d1
avoir la priorité dans les conflits, faites:Sinon, inversez
d2
etd1
.la source
Ma solution est de définir une fonction de fusion . Ce n'est pas sophistiqué et ne coûte qu'une ligne. Voici le code en Python 3.
Des tests
Cela fonctionne pour un nombre arbitraire d'arguments de dictionnaire. S'il y avait des clés en double dans ces dictionnaires, la clé du dictionnaire le plus à droite dans la liste d'arguments l'emporte.
la source
.update
appel (merged={}
suivi defor d in dict: merged.update(d)
) serait plus courte, plus lisible et plus efficace.reduce
andlambda
s, qu'en est-ilreturn reduce(lambda x, y: x.update(y) or x, dicts, {})
?Trey Hunner a un joli article de blog décrivant plusieurs options pour fusionner plusieurs dictionnaires, y compris (pour python3.3 +) ChainMap et le déballage de dictionnaire .
la source
À partir de
Python 3.9
, l'opérateur|
crée un nouveau dictionnaire avec les clés et les valeurs fusionnées de deux dictionnaires:Ce:
Notez également l'
|=
opérateur qui modifie d2 en fusionnant d1 dans, avec priorité sur les valeurs d1:la source
Je pense que, comme indiqué ci-dessus, l'utilisation
d2.update(d1)
est la meilleure approche et que vous pouvez également copierd2
premier si vous en avez encore besoin.Cependant, je tiens à souligner que
dict(d1, **d2)
c'est en fait une mauvaise façon de fusionner des dictionnaires en général, car les arguments de mot-clé doivent être des chaînes, donc cela échouera si vous avez undict
tel que:la source