关于python:合并字典而不覆盖以前的值,其中value是列表

Merge dictionaries without overwriting previous value where value is a list

我知道在不覆盖值的情况下合并字典,合并"多个"python字典,如何用相同的键合并多个dict?以及如何在一个表达式中合并两个Python字典?.

不过,我的问题略有不同。

假设我有这三本字典

1
2
3
dict_a = {'a': [3.212], 'b': [0.0]}
dict_b = {'a': [923.22, 3.212], 'c': [123.32]}
dict_c = {'b': [0.0]}

合并结果应为

1
result_dict = {'a': [3.212, 3.212, 923.22], 'b': [0.0, 0.0], 'c': [123.32]}

这里的代码可以工作,但会在列表中嵌套列表

1
2
3
4
5
6
result_dict = {}
dicts = [dict_a, dict_b, dict_c]

for d in dicts:
    for k, v in d.iteritems():
        result_dict.setdefault(k, []).append(v)

使用extend而不是append,可以防止嵌套列表,但如果键还不存在,则无法工作。所以基本上,它应该在不覆盖的情况下执行update,就像在其他线程中那样。

对不起,这是我的错。昨天太晚了,我没有注意到出错的那一行不是我想象的那样,因此我假设我的字典已经有了上述结构。事实上,假设与TypeError有关,mgilson是正确的。确切地说,是一个"可统一的浮动"。


我很肯定,.extend在这里工作……

1
2
3
4
5
6
7
8
9
10
11
12
>>> dict_a = {'a': [3.212], 'b': [0.0]}
>>> dict_b = {'a': [923.22, 3.212], 'c': [123.32]}
>>> dict_c = {'b': [0.0]}
>>> result_dict = {}
>>> dicts = [dict_a, dict_b, dict_c]
>>>
>>> for d in dicts:
...     for k, v in d.iteritems():
...         result_dict.setdefault(k, []).extend(v)
...
>>> result_dict
{'a': [3.212, 923.22, 3.212], 'c': [123.32], 'b': [0.0, 0.0]}

魔法就在dict.setdefault方法中。如果键不存在,setdefault将添加一个具有您提供的默认值的新键。然后返回该默认值,然后可以修改该值。

请注意,如果项目v不可重复,此解决方案将出现问题。也许这就是你的意思?例如,如果dict_a = {'a': [3.212], 'b': 0.0}

在这种情况下,我认为你需要借助于在try-except条款中抓住TypeError: type object is not iterable

1
2
3
4
5
6
for d in dicts:
    for k, v in d.iteritems():
        try:
            result_dict.setdefault(k, []).extend(v)
        except TypeError:
            result_dict[k].append(v)