如何将值列表的字典合并到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]}
怎么可以用任意数量的词典来完成,而不仅仅是两个?
答案 0 :(得分:5)
您可以使用以下方法,该方法使用sets
和dict 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