合并Python字典

27

我正在尝试按以下方式合并Python字典:

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]}

我希望保留两个字典中的所有键。
是否有有效的方法可以实现这一点?


@rcreswick的答案对于<a href="https://dev59.com/43VD5IYBdhLWcg3wQJOT">这个问题</a>应该能满足你的需求。 - Seth
1
稍微进行一些格式化处理会有很大的帮助。请尝试编辑您的问题:选择代码并单击编辑窗口中的“101 010”按钮。此外,将dict1和dict2分成两行。 - Pete
另请参阅:类似问题 - dreftymac
5个回答

22
output = {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})

你能详细说明一下为什么这个代码可以工作吗?dict()update()方法中传递的对象是什么?它是一个生成器吗? - Heisenberg
1
@Heisenberg,它们是生成器表达式(也称为“genexp”),是“列表推导式”(也称为“listcomp”)的生成器等效物--一种方便的方法来制作内联生成器(与等效的listcomp相比节省了瞬态使用的内存,如果列表后来不需要--因为dictupdate都只需要一些迭代器,以(key, value)形式呈现的2项元组)。 - Alex Martelli

17

这将有效:

{k: [dict1.get(k), dict2.get(k)] for k in set(dict1.keys() + dict2.keys())}

输出:

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

9
在Python2.7或Python3.1中,您可以轻松地使用列表、集合和字典推导式结合起来,通用于任意数量的字典!
>>> 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.6不支持集合推导或字典推导。

>>> 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]}

1
py3k 也有字典推导式 ;) - SilentGhost
@SilentGhost,我也正在想这个。当我看到你的评论时,我感到非常惊讶 :) 现在在3.1中已经相当简洁了。 - John La Rooy

2

In Python3.1,

output = {k:[dict1.get(k),dict2.get(k)] for k in dict1.keys() | dict2.keys()}<br>
In Python2.6,
output = dict((k,[dict1.get(k),dict2.get(k)]) for k in set(dict1.keys() + dict2.keys()))


1
使用itertools模块中的chain.from_iterable,可以避免使用列表/字典/集合推导式,代码如下:
dict(chain.from_iterable(map(lambda d: d.items(), list_of_dicts])))

这取决于个人偏好,相较于双重理解,它可能更方便、易读或者更不方便、难读。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接