I have two dictionaries as follows:
D1={'a':1,'b':2,'c':3}
and
D2={'b':2,'c':3,'d':1}
I want to merge these two dictionaries and the result should be as follows:
D3={'a':1,'b':2,'c':3,'b':2,'c':3,'d':1}
how can I achieve this in python?
I have two dictionaries as follows:
D1={'a':1,'b':2,'c':3}
and
D2={'b':2,'c':3,'d':1}
I want to merge these two dictionaries and the result should be as follows:
D3={'a':1,'b':2,'c':3,'b':2,'c':3,'d':1}
how can I achieve this in python?
I want to merge these two dictionaries and the result should be as follows:
D3={'a':1,'b':2,'c':3,'b':2,'c':3,'d':1}
how can I achieve this in python?
You can't. You can only have one value per key in a Python dict. What you can do is to have a list or a set as the value.
Here is an example with a set:
d1 = { 'a': 1, 'b': 2, 'c': 3 }
d2 = { 'a': 1, 'b': 5, 'd': 4 }
d3 = {}
def add_dict(target, d):
for key in d:
target.setdefault(key, set([])).add(d[key])
add_dict(d3, d1)
add_dict(d3, d2)
This will give you d3
:
{'a': set([1]), 'c': set([3]), 'b': set([2, 5]), 'd': set([4])}
You can also do this with a list (possibly closer to your example):
d1 = { 'a':1, 'b':2, 'c': 3}
d2 = { 'b':2 ,'c':3, 'd': 1}
d3 = {}
def add_dict(target, d):
for key in d:
target.setdefault(key, []).append(d[key])
add_dict(d3, d1)
add_dict(d3, d2)
You'll get this:
{'a': [1], 'c': [3, 3], 'b': [2, 2], 'd': [1]}
However, looking at {'a':1,'b':2,'c':3,'b':2,'c':3,'d':1}
(which can't be a dict), it seems that you're after a different data structure altogether. Perhaps something like this:
d1 = { 'a':1, 'b':2, 'c': 3}
d2 = { 'b':2 ,'c':3, 'd': 1}
result = []
result += [ { 'key': key, 'value': d1[key] } for key in d1 ]
result += [ { 'key': key, 'value': d2[key] } for key in d2 ]
This would produce this, which looks closer to the data structure you had in mind initially:
[ {'value': 1, 'key': 'a'},
{'value': 3, 'key': 'c'},
{'value': 2, 'key': 'b'},
{'value': 3, 'key': 'c'},
{'value': 2, 'key': 'b'},
{'value': 1, 'key': 'd'} ]
You may want to try:
D3 = {}
D3.update(D1)
D3.update(D2)
Here, we're creating an empty dictionary D3
first, then update it from the two other dictionaries.
Note that you need to be careful with the order of the updates: if D2
shares some keys with D1
, the code above will overwrite the corresponding entries of D1
with those of D2
.
Note as well that the keys will not be repeated. The example you give D3={a:1,b:2,c:3,b:2,c:3,d:1}
is not a valid dictionary.
Dictionaries by definition can't have duplicate keys, so "merging" dictionaries will actually give the following result (note the order is arbitrary):
{'a': 1, 'b': 2, 'c': 3, 'd': 1}
You can create a clone of one of the dictionaries and merge the entries from the other into it:
D3 = dict(D1)
D3.update(D2)
or you can create a new dictionary from the concatenation of the (key, value) tuples from each input dictionary:
D3 = dict(D1.items() + D2.items())
If you really want multiple values for duplicate keys, you need something like a list of values for each key:
from itertools import groupby
dict(( (key, [v for k, v in group]) for key, group in groupby(sorted(D1.items() + D2.items()), lambda x: x[0])))
What are you asking is not possible, since you cannot have two different keys with the same value in a Python dictionary.
The closest answer to your question is:
D3 = dict( D1.items() + D2.items() )
Note: if you have different values for the same key, the ones from D2 will be the ones in D3.
Example:
D1 = { 'a':1, 'b'=2 }
D2 = { 'c':3, 'b':3}
Then, D3 will be:
D3= { 'a':1, 'b':3, 'c':3 }
In [3]: D1={'a':1,'b':2,'c':3}
In [4]: D2={'b':2,'c':3,'d':1}
In [5]: D1.update(D2)
In [6]: D1
Out[6]: {'a': 1, 'b': 2, 'c': 3, 'd': 1}
Update
Alternative solutions
In [9]: D3=D1.copy()
In [10]: D3.update(D2)
In [11]: D3
Out[11]: {'a': 1, 'b': 2, 'c': 3, 'd': 1}
In [12]: D4=dict(D1, **D2)
or
In [13]: D4
Out[13]: {'a': 1, 'b': 2, 'c': 3, 'd': 1}
or
In [16]: D5 = dict(D1.items() + D2.items())
In [17]: D5
Out[17]: {'a': 1, 'b': 2, 'c': 3, 'd': 1}