This question already has an answer here:
-
How to merge two dictionaries in a single expression?
44 answers
How do you calculate the union of two dict
objects in Python, where a (key, value)
pair is present in the result iff key
is in
either dict (unless there are duplicates)?
For example, the union of {'a' : 0, 'b' : 1}
and {'c' : 2}
is {'a' : 0, 'b' : 1, 'c' : 2}
.
Preferably you can do this without modifying either input dict
. Example of where this is useful: Get a dict of all variables currently in scope and their values
This question provides an idiom. You use one of the dicts as keyword arguments to the dict()
constructor:
dict(y, **x)
Duplicates are resolved in favor of the value in x
; for example
dict({'a' : 'y[a]'}, **{'a', 'x[a]'}) == {'a' : 'x[a]'}
You can also use update
method of dict like
a = {'a' : 0, 'b' : 1}
b = {'c' : 2}
a.update(b)
print a
Two dictionaries
def union2(dict1, dict2):
return dict(list(dict1.items()) + list(dict2.items()))
n dictionaries
def union(*dicts):
return dict(itertools.chain.from_iterable(dct.items() for dct in dicts))
If you need both dicts to remain independent, and updatable, you can create a single object that queries both dictionaries in its __getitem__
method (and implement get
, __contains__
and other mapping method as you need them).
A minimalist example could be like this:
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]
And it works:
>>> 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
>>>