我希望得到一个类似联合的多个(3个或更多)字典的合并字典。
我有什么:
d1 = {'key1': 'x1', 'key2': 'y1', 'key4': 'z1'}
d2 = {'key1': 'x2', 'key2': 'y2', 'key5': 'z2'}
d3 = {'key1': 'x3', 'key3': 'y3', 'key4': 'z3'}
我想得到什么:
d_merged = {
'key1' : ('x1', 'x2', 'x3'),
'key2' : ('y1', 'y2', None),
'key3' : (None, None, 'y3'),
'key4' : ('z1', None, 'z3'),
'key5' : (None, 'z2', None)
}
对此最有效/最有效的方式是什么?
我找到了2个字典here的例子,但有没有更好的方法(例如:理解)什么可以解决一些字典中缺少的关键问题?
有没有办法为任意数量的输入词典执行相同的合并?
答案 0 :(得分:5)
生成所有键的并集,然后遍历该联合以收集值:
result = {key: (d1.get(key), d2.get(key), d3.get(key))
for key in d1.keys() | d2.keys() | d3.keys()}
在Python 3中,dict.keys()
为您提供dictionary view object,其作用类似于一组。您可以在这些对象上使用|
创建所有词典中所有键的并集。
在Python 2中,改为使用dict.viewkeys()
。
演示:
>>> d1 = {'key1': 'x1', 'key2': 'y1', 'key4': 'z1'}
>>> d2 = {'key1': 'x2', 'key2': 'y2', 'key5': 'z2'}
>>> d3 = {'key1': 'x3', 'key3': 'y3', 'key4': 'z3'}
>>> {key: (d1.get(key), d2.get(key), d3.get(key))
... for key in d1.keys() | d2.keys() | d3.keys()}
{'key1': ('x1', 'x2', 'x3'), 'key5': (None, 'z2', None), 'key3': (None, None, 'y3'), 'key4': ('z1', None, 'z3'), 'key2': ('y1', 'y2', None)}
>>> from pprint import pprint
>>> pprint(_)
{'key1': ('x1', 'x2', 'x3'),
'key2': ('y1', 'y2', None),
'key3': (None, None, 'y3'),
'key4': ('z1', None, 'z3'),
'key5': (None, 'z2', None)}
对于字典的任意序列,请对生成器表达式使用set().union(*dictionaries)
和tuple()
调用:
dictionaries = (d1, d2, d3) # or more
result = {key: tuple(d.get(key) for d in dictionaries)
for key in set().union(*dictionaries)}