我想得到多个(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)
}


最有效的方法是什么?

我找到了两个词典here的示例,但是有没有更好的方法(例如:理解),什么可以解决这里某些词典缺少的关键问题呢?

是否可以对任意数量的输入词典进行相同的合并?

最佳答案

产生所有键的并集,然后对该联合进行迭代以收集值:

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

关于python - 如何按键合并多个词典,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47451210/

10-12 21:22