-1

我有两个或多个字典,我喜欢将它合并为一个,并保留与列表相同的键的多个值。我无法分享原始代码,所以请帮我看看下面的例子。

输入:

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}
4

3 回答 3

1

我建议你阅读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)

这具有为值的单次出现创建单元素列表的“缺点”,但也许您可以解决这个问题。

于 2018-10-18T10:51:44.037 回答
0

请在下方查找以解决您的问题。我希望这对你有用。

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)
于 2018-10-18T10:58:35.903 回答
0

用于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})
于 2018-10-18T11:20:54.257 回答