2016-09-21 117 views
-4

我有一个像下面一段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的键和作为values的结果_dict。我的问题是,在for循环结束时,final_dict中的所有值都与result_dict的最后一个值相同。我认为它覆盖了以前的值(可能是因为它是一个参考)。如何解决这个问题..?

编辑1:merge_dicts实际上创建两个字典的联合。当我打印句号时,它会按预期打印不同的字典。但是,当我将它赋值为final_dict时,它将使用最新的值修改所有以前的值。

编辑2:所有的输入数据是一个字典,我从json文件中获得。最终的字典应该类似于下面

final_dict = { 
    id1 : dict1, 
    id2 : dict2 
} 

但我越来越喜欢以下(这是覆盖所有最新的字典值的值)

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

'merge_dicts'是做什么用的?你处理什么输入数据?输出数据最终应该是什么样子?请提供这些详细信息以确保你有一个好的[mcve] – idjaw

+0

我怀疑你的'merge_dict'函数正在修改'default_dict'并将其返回 –

+0

你可以*请给出实际的例子来帮助更好地说明它是怎么回事你的代码? – idjaw

回答

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 
+0

我不能这样做,因为我正在将一个函数result_dict传递给一个函数,该函数将id作为返回值。 – user3157132

+0

'return_value_from_a_function'是否会将任何内容写入结果_dict? – thiruvenkadam

+0

不需要。它只需将字典作为参数,然后返回一个ID。然后,我必须将id和result_dict写入final_dict。 – user3157132

-1

您在final_dict之前试过copy.deepcopy(resultant_dict)吗?

通常它可以解决我的问题。

+0

为什么这会有帮助? –

+0

因为它存储的是实际的内容,而不是'结果_dict'的地址,我想。试试下面的'A =字典() B =字典() 为我的range(5): B [i] =我 A [1] = B 打印了' – mengg

+0

权,但如果你做一个在将其放入'final_dict'之前复制,这没有帮助。在OP的代码中,在这一点之后没有对它做任何突变。 –