views:

819

answers:

5

Hi everyone,

I am trying to merge the following python dictionaries as follow:

dict1= {'paul':100, 'john':80, 'ted':34, 'herve':10}
dict2 = {'paul':'a', 'john':'b', 'ted':'c', 'peter':'d'}

output = {'paul':[100,'a'], 'john':[80, 'b'], 'ted':[34,'c'], 'peter':[None, 'd'], 'herve':[10, None]}

Any tip about an efficient way to do this?

Thanks Joey

+1  A: 

@rcreswick's answer to this question should suit your needs.

Seth
+5  A: 
output = dict((k, [dict1[k], dict2.get(k)]) for k in dict1)
output.update((k, [None, dict2[k]]) for k in dict2 if k not in dict1)
Alex Martelli
+4  A: 

This will work:

dict((k, [dict1.get(k), dict2.get(k)]) for k in set(dict1.keys() + dict2.keys()))

Output:

{'john': [80, 'b'], 'paul': [100, 'a'], 'peter': [None, 'd'], 'ted': [34, 'c'], 'herve': [10, None]}
Nadia Alramli
A: 
asdfg
this doesn't work
SilentGhost
Sorry my bad.. I am using python3.1..
asdfg
+2  A: 

In Python3.1 you can easily generalise to work with any number of dictionaries using a combination of list, set and dict comprehensions!

>>> dict1 = {'paul':100, 'john':80, 'ted':34, 'herve':10}
>>> dict2 = {'paul':'a', 'john':'b', 'ted':'c', 'peter':'d'}
>>> dicts = dict1,dict2
>>> {k:[d.get(k) for d in dicts] for k in {k for d in dicts for k in d}}
{'john': [80, 'b'], 'paul': [100, 'a'], 'peter': [None, 'd'], 'ted': [34, 'c'], 'herve': [10, None]}

Python2 doesn't have set comprehensions or dict comprehensions

>>> dict1 = {'paul':100, 'john':80, 'ted':34, 'herve':10}
>>> dict2 = {'paul':'a', 'john':'b', 'ted':'c', 'peter':'d'}
>>> dicts = dict1,dict2
>>> dict((k,[d.get(k) for d in dicts]) for k in set(k for d in dicts for k in d))
{'john': [80, 'b'], 'paul': [100, 'a'], 'peter': [None, 'd'], 'ted': [34, 'c'], 'herve': [10, None]}
gnibbler
py3k also has dict comprehensions ;)
SilentGhost
@SilentGhost, I was just thinking that too. Imagine my surprise when I saw your comment :) It's quite succinct in 3.1 now
gnibbler