合并任意数量的列表字典

Merge an arbitrary number of dictionaries of lists

如何将值是列表的字典合并到 Python 中,以便所有键都移到一个字典中,并且每个列表的所有元素都移到每个键的单个列表中?

例如,使用这些词典:

x = {'a': [2], 'b': [2]}
y = {'b': [11], 'c': [11]}

...合并后的结果应该是这样的:

{'a': [2], 'b': [2, 11], 'c': [11]}

这怎么能用任意数量的词典来完成,而不仅仅是两个?

您可以使用以下方法,该方法使用 setsdict comprehension

x = {'a': [2], 'b': [2]} 
y = {'b': [11], 'c': [11]}

all_keys = set(x) | set(y)

print {k:x.get(k, [])+y.get(k, []) for k in all_keys}

结果:

{'a': [2], 'c': [11], 'b': [2, 11]}
for k, v in y.items():
    x.setdefault(k, []).extend(v)

x = {'a': [2], 'b': [2]}
y = {'b': [11], 'c': [11]}
result = {}
for key,value in x.iteritems():
    result[key] = value
for key,value in y.iteritems():
    if key in result:
        for l in value:
            result[key].append(l)
    else:
        result[key] = value
print result

要将所有列表收集在一起,形成一个 result 字典,将您的键映射到列表。最简单的方法是使用 dict.setdefault() followed by a call to list.extend 来增加列表:

r = {}
for d in [x, y]:
    for k, v in d.items():
        r.setdefault(k, []).extend(v)

更优雅的方式是使用 collections.defaultdict(),其中自动默认是一个新的空列表:

from collections import defaultdict

r = defaultdict(list)
for d in [x, y]:
    for k, v in d.items():
        r[k].extend(v)

这是一个适用于任意数量词典的解决方案:

def collect(*dicts):
    result = {}
    for key in set.union(*(set(d) for d in dicts)):
        result[key] = sum((d.get(key, []) for d in dicts), [])
    return result

它本质上是 Tanveer 答案的概括,利用了 set.union() 可以接受任意数量的字典作为参数这一事实。

这是一个正在使用的函数示例:

>>> x = {'a': [2], 'b': [2]}
>>> y = {'b': [11], 'c': [11]}
>>> collect(x, y)
{'a': [2], 'c': [11], 'b': [2, 11]}

...并且有多个词典:

>>> z = {'c': [12, 13], 'd': [5]}
>>> collect(x, y, z)
{'a': [2], 'c': [11, 12, 13], 'b': [2, 11], 'd': [5]}