2016-09-21 151 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的代碼中,在這一點之後沒有對它做任何突變。 –