Union d'objets dict en Python [dupliquer]

cette question a déjà une réponse ici:

comment calculer l'union de deux objets dict en Python, où une paire (key, value) est présente dans le résultat iff key est in soit dict (sauf s'il y a des doubles)?

par exemple, l'union de {'a' : 0, 'b' : 1} et {'c' : 2} est {'a' : 0, 'b' : 1, 'c' : 2} .

de préférence, Vous pouvez le faire sans modifier l'entrée dict . Exemple de cas où cela est utile: obtenir un dict de toutes les variables actuellement dans le champ d'application et leurs valeurs

85
demandé sur Community 2012-03-22 13:36:47

4 réponses

Cette question fournit un idiome. Vous utilisez l'un des dicts comme argument de mots-clés pour le dict() constructeur:

dict(y, **x)

les doublons sont résolus en faveur de la valeur de x ; par exemple

dict({'a' : 'y[a]'}, **{'a', 'x[a]'}) == {'a' : 'x[a]'}
75
répondu Mechanical snail 2017-05-23 11:55:00

vous pouvez également utiliser update méthode de dict like

a = {'a' : 0, 'b' : 1}
b = {'c' : 2}

a.update(b)
print a
67
répondu Nilesh 2012-03-22 09:54:27

deux dictionnaires

def union2(dict1, dict2):
    return dict(list(dict1.items()) + list(dict2.items()))

n dictionnaires

def union(*dicts):
    return dict(itertools.chain.from_iterable(dct.items() for dct in dicts))
21
répondu Mathieu Larose 2016-10-02 18:19:57

si vous avez besoin que les deux dicts restent indépendants, et puissent être mis à jour, vous pouvez créer un objet unique qui interroge les deux dictionnaires dans sa méthode __getitem__ (et implémenter get , __contains__ et d'autres méthodes de mappage comme vous en avez besoin).

un exemple minimaliste pourrait être comme ceci:

class UDict(object):
   def __init__(self, d1, d2):
       self.d1, self.d2 = d1, d2
   def __getitem__(self, item):
       if item in self.d1:
           return self.d1[item]
       return self.d2[item]

et ça marche:

>>> a = UDict({1:1}, {2:2})
>>> a[2]
2
>>> a[1]
1
>>> a[3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 7, in __getitem__
KeyError: 3
>>> 
7
répondu jsbueno 2012-03-22 11:24:26