合并任意数量的列表字典

4
如何在Python中合并值为列表的字典,以便所有键都被移动到一个字典中,并且每个键对应的所有列表元素被移动到一个单独的列表中?
例如,使用以下字典:
x = {'a': [2], 'b': [2]}
y = {'b': [11], 'c': [11]}

合并的结果应该是这样的:
{'a': [2], 'b': [2, 11], 'c': [11]}

如何使用任意数量的字典来完成这个任务,而不仅仅是两个字典?
5个回答

5
你可以使用以下方法,该方法使用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]}

1
all_keys = set(x) | set(y) 在2和3中都可以工作。 - DSM
谢谢 @DSM Plus,我甚至不喜欢 .keys() 方法。 - Tanveer Alam
@DSM 没有注意到那个 :) - Tanveer Alam
1
@StefanPochmann:嗯,不值得担心。此外,如果我们想要做通用版本(带有任意数量的字典),单独使用变量会更清晰明了。 - DSM
@Stefan OP 实际上在未编辑的问题中确实要求解决 N 个字典的问题:“结果应该是这样的,但是我如何处理任意数量的字典”(我强调)。 - Zero Piraeus
显示剩余4条评论

5
for k, v in y.items():
    x.setdefault(k, []).extend(v)

4
为了将所有列表汇总在一起,需要形成一个名为result的字典,将键映射到列表。最简单的方法是使用dict.setdefault(),然后调用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)

1

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

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

0

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


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