gpt4 book ai didi

python - 合并字典而不覆盖以前的值,其中值是一个列表

转载 作者:太空宇宙 更新时间:2023-11-04 01:22:10 25 4
gpt4 key购买 nike

我知道 Merge dictionaries without overwriting values , merging "several" python dictionaries , How to merge multiple dicts with same key? , 和 How to merge two Python dictionaries in a single expression? .

但是,我的问题略有不同。

假设我有这三本词典

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 = {'a': [3.212, 3.212, 923.22], 'b': [0.0, 0.0], 'c': [123.32]}

此处的代码有效,但会在列表中嵌套列表

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 会阻止嵌套列表,但如果键不存在则不起作用。所以基本上它应该像在其他线程中那样执行更新而不覆盖。

对不起,这是我的失误。昨天太晚了,我没有注意到抛出错误的那一行不是我认为的那一行,因此假设我的词典已经具有上述结构。事实上,假设 mgilsonTypeError 相关是正确的。准确地说,是一个“统一的 float ”。

最佳答案

我很确定 .extend 在这里工作......

>>> 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:

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

关于python - 合并字典而不覆盖以前的值,其中值是一个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20509570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com