合并任意数量的列表字典
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]}
这怎么能用任意数量的词典来完成,而不仅仅是两个?
您可以使用以下方法,该方法使用 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]}
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]}
如何将值是列表的字典合并到 Python 中,以便所有键都移到一个字典中,并且每个列表的所有元素都移到每个键的单个列表中?
例如,使用这些词典:
x = {'a': [2], 'b': [2]}
y = {'b': [11], 'c': [11]}
...合并后的结果应该是这样的:
{'a': [2], 'b': [2, 11], 'c': [11]}
这怎么能用任意数量的词典来完成,而不仅仅是两个?
您可以使用以下方法,该方法使用 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]}
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]}