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
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]'}
Vous pouvez aussi utiliser update
méthode de dict comme
a = {'a' : 0, 'b' : 1}
b = {'c' : 2}
a.update(b)
print a
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))
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
>>>