我有一段像下面的python代码(很抱歉我无法粘贴我的实际代码,因为它非常大)
final_dict = {}
default_dict = some_data
for dict in list_of_dicts:
# I am getting list_of_dicts from a json file
resultant_dict = merge_dicts(dict, default_dict)
id = return_value_from_a_function(resultant_dict)
final_dict[id] = resultant_dict # id will be different in each loop
所以final_dict应该有id作为键,而outcome_dict作为值。我的问题是,在for循环结束时,final_dict中的所有值都与resul_dict的最后一个值相同。我认为它覆盖了以前的值(可能是因为它的参考)。如何解决这个问题..?
编辑1:merge_dicts实际上创建了两个dicts的并集。当我打印resul_dict时,它会按照预期每次打印不同的dict。但是当我将它作为一个值分配给final_dict时,它会用最新的值修改所有以前的值。
编辑2:所有输入数据都是我从json文件获取的dict。最终的词典应该如下所示
final_dict = {
id1 : dict1,
id2 : dict2
}
但我得到如下(它用最新的dict值覆盖所有值)
final_dict = {
id1 : dict2,
id2 : dict2
}
编辑3:这就是merge_dicts的工作方式
def merge_dicts(tmp1, tmp2):
'''
merges tmp2 into tmp1
'''
for key in tmp2:
if key in tmp1:
if isinstance(tmp1[key], dict) and isinstance(tmp2[key], dict):
merge_dicts(tmp1[key], tmp2[key])
else :
tmp1[key] = tmp2[key]
else:
tmp1[key] = tmp2[key]
return tmp1
答案 0 :(得分:1)
为什么不首先生成id
然后立即在那里分配merge_dicts值?
for dict in list_of_dicts:
# I am getting list_of_dicts from a json file
id = return_value_from_a_function
final_dict[id] = merge_dicts(dict, default_dict)
编辑:由于return_value_from_a_function
函数使用resultant_dict
,return_value_from_a_function
似乎修改了resultant_dict
。
from copy import deepcopy
for input_dict in list_of_dicts:
resultant_dict = {}
resultant_dict = merge_dicts(input_dict, default_dict)
# I am getting list_of_dicts from a json file
value_dict = deepcopy(resultant_dict)
id = return_value_from_a_function(resultant_dict)
final_dict[id] = value_dict
答案 1 :(得分:-1)
在您输入copy.deepcopy(resultant_dict)
之前,您是否尝试final_dict
?
通常它解决了我的问题。