如何将两个或多个字典合并为一个字典并保留与列表相同的键的多个值?
How to merge two or more dict into one dict with retaining multiple values of same key as list?
我有两个或更多字典,我喜欢将它合并为一个,并保留与列表相同的键的多个值。我不能分享原始代码,所以请帮我看下面的例子。
输入:
a= {'a':1, 'b': 2}
b= {'aa':4, 'b': 6}
c= {'aa':3, 'c': 8}
输出:
c= {'a':1,'aa':[3,4],'b': [2,6], 'c': 8}
我建议您阅读 defaultdict:它允许您提供一个工厂方法来初始化丢失的键,即如果查找了一个键但没有找到,它会通过调用 [=11 创建一个值=].看这个例子,它可能会让事情更清楚:
from collections import defaultdict
a = {'a': 1, 'b': 2}
b = {'aa': 4, 'b': 6}
c = {'aa': 3, 'c': 8}
stuff = [a, b, c]
# our factory method is the list-constructor `list`,
# so whenever we look up a value that doesn't exist, a list is created;
# we can always be sure that we have list-values
store = defaultdict(list)
for s in stuff:
for k, v in s.items():
# since we know that our value is always a list, we can safely append
store[k].append(v)
print(store)
这具有为单次出现的值创建单元素列表的 "downside",但也许您可以解决这个问题。
请在下方查找以解决您的问题。我希望这对你有用。
from collections import defaultdict
a = {'a':1, 'b': 2}
b = {'aa':4, 'b': 6}
c={'aa':3, 'c': 8}
dd = defaultdict(list)
for d in (a,b,c):
for key, value in d.items():
dd[key].append(value)
print(dd)
使用defaultdict
自动创建一个包含空列表的字典条目。
要在 单个 循环中处理所有源词典,请使用 itertools.chain
.
主循环只是将当前项目的值添加到下面的列表中
当前密钥。
如您所写,对于某些键下只有 一个 项的情况,
你必须生成一个工作字典(使用 字典理解),
仅限于具有仅包含一项的值(列表)的项目。
此类项目的值应仅包含第一个(也是唯一的)数字
来自源列表。
然后用这个词典更新d
。
所以整个脚本可以出奇的短,如下:
from collections import defaultdict
from itertools import chain
a = {'a':1, 'b': 2}
b = {'aa':4, 'b': 6}
c = {'aa':3, 'c': 8}
d = defaultdict(list)
for k, v in chain(a.items(), b.items(), c.items()):
d[k].append(v)
d.update({ k: v[0] for k, v in d.items() if len(v) == 1 })
如您所见,实际处理代码仅包含在(最后)4 行中。
如果你打印d
,结果是:
defaultdict(list, {'a': 1, 'b': [2, 6], 'aa': [4, 3], 'c': 8})
我有两个或更多字典,我喜欢将它合并为一个,并保留与列表相同的键的多个值。我不能分享原始代码,所以请帮我看下面的例子。
输入:
a= {'a':1, 'b': 2}
b= {'aa':4, 'b': 6}
c= {'aa':3, 'c': 8}
输出:
c= {'a':1,'aa':[3,4],'b': [2,6], 'c': 8}
我建议您阅读 defaultdict:它允许您提供一个工厂方法来初始化丢失的键,即如果查找了一个键但没有找到,它会通过调用 [=11 创建一个值=].看这个例子,它可能会让事情更清楚:
from collections import defaultdict
a = {'a': 1, 'b': 2}
b = {'aa': 4, 'b': 6}
c = {'aa': 3, 'c': 8}
stuff = [a, b, c]
# our factory method is the list-constructor `list`,
# so whenever we look up a value that doesn't exist, a list is created;
# we can always be sure that we have list-values
store = defaultdict(list)
for s in stuff:
for k, v in s.items():
# since we know that our value is always a list, we can safely append
store[k].append(v)
print(store)
这具有为单次出现的值创建单元素列表的 "downside",但也许您可以解决这个问题。
请在下方查找以解决您的问题。我希望这对你有用。
from collections import defaultdict
a = {'a':1, 'b': 2}
b = {'aa':4, 'b': 6}
c={'aa':3, 'c': 8}
dd = defaultdict(list)
for d in (a,b,c):
for key, value in d.items():
dd[key].append(value)
print(dd)
使用defaultdict
自动创建一个包含空列表的字典条目。
要在 单个 循环中处理所有源词典,请使用 itertools.chain
.
主循环只是将当前项目的值添加到下面的列表中 当前密钥。
如您所写,对于某些键下只有 一个 项的情况, 你必须生成一个工作字典(使用 字典理解), 仅限于具有仅包含一项的值(列表)的项目。 此类项目的值应仅包含第一个(也是唯一的)数字 来自源列表。
然后用这个词典更新d
。
所以整个脚本可以出奇的短,如下:
from collections import defaultdict
from itertools import chain
a = {'a':1, 'b': 2}
b = {'aa':4, 'b': 6}
c = {'aa':3, 'c': 8}
d = defaultdict(list)
for k, v in chain(a.items(), b.items(), c.items()):
d[k].append(v)
d.update({ k: v[0] for k, v in d.items() if len(v) == 1 })
如您所见,实际处理代码仅包含在(最后)4 行中。
如果你打印d
,结果是:
defaultdict(list, {'a': 1, 'b': [2, 6], 'aa': [4, 3], 'c': 8})