将dict作为值添加到另一个dict将覆盖之前的值

时间:2016-09-21 14:44:41

标签: python python-2.7 dictionary

我有一段像下面的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

2 个答案:

答案 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_dictreturn_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

通常它解决了我的问题。