我有两个或多个字典,我喜欢将它合并为一个,并保留与列表相同的键的多个值。我无法分享原始代码,所以请帮我看看下面的例子。
输入:
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}
我有两个或多个字典,我喜欢将它合并为一个,并保留与列表相同的键的多个值。我无法分享原始代码,所以请帮我看看下面的例子。
输入:
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:它允许你提供一个初始化丢失键的工厂方法,即如果一个键被查找但没有找到,它通过调用创建一个值factory_method(missing_key)
。看这个例子,它可能会让事情更清楚:
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)
这具有为值的单次出现创建单元素列表的“缺点”,但也许您可以解决这个问题。
请在下方查找以解决您的问题。我希望这对你有用。
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})