web-dev-qa-db-fra.com

Union d'objets dict in Python

Comment calculez-vous l'union de deux objets dict en Python, où un (key, value) La paire est présente dans le résultat ssi key est in soit dict (sauf s’il existe des doublons)?

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 où cela est utile: Obtenez un dict de toutes les variables actuellement dans la portée et leurs valeurs

106
Mechanical snail

Cette question fournit un idiome. Vous utilisez l'un des dicts comme arguments de mot clé du constructeur dict():

dict(y, **x)

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

dict({'a' : 'y[a]'}, **{'a', 'x[a]'}) == {'a' : 'x[a]'}
90
Mechanical snail

Vous pouvez aussi utiliser update méthode de dict comme

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

a.update(b)
print a
81
Nilesh

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))
24
Mathieu Larose

Si vous voulez que les deux dictionnaires restent indépendants et puissent être mis à jour, vous pouvez créer un seul objet qui interroge les deux dictionnaires dans son __getitem__ méthode (et implémenter get, __contains__ et d’autres méthodes de mappage selon vos besoins).

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 il fonctionne:

>>> 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
>>> 
8
jsbueno