合并任意数量的列表字典

时间:2015-05-16 15:32:08

标签: python list dictionary merge

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

例如,使用这些词典:

android:uses-permission#android.permission.READ_PHONE_STATE
IMPLIED from AndroidManifest.xml:2:1 reason: the.library has a targetSdkVersion < 4

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

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

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

5 个答案:

答案 0 :(得分: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 :(得分:5)

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

答案 2 :(得分:4)

要收集所有列表,请形成一个结果字典,将您的键映射到列表。最简单的方法是使用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)

答案 3 :(得分: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]}

答案 4 :(得分: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