2017-08-17 61 views
3

我想創建一個總結另一個字典的字典。我希望summary_dict僅在關鍵字與details_dict中的「父」值相匹配時更新。我寫的東西似乎沒有像我期望的那樣訪問summary_dict。打印語句顯示它繼續附加到循環中的第一個迭代,而不是從summary_dict中獲取正確的值。Python字典在循環中沒有像預期的那樣更新

detail_dict = {'a123': {"data": [1, 2, 3, 4], "parent": "a"}, 
       'a124': {"data": [1, 2, 3, 4, 5], "parent": "a"}, 
       'b123': {"data": [1, 2, 3], "parent": "b"}, 
       'b124': {"data": [1], "parent": "b"}} 

summary_dict = dict.fromkeys(["a", "b"], {"data": [], 
              "data_len": []}) 

for k, v in detail_dict.iteritems(): 
    summary_dict[v['parent']]["data"].append(v["data"]) 
    summary_dict[v['parent']]["data_len"].append(len(v["data"])) 
    print "\nMy value is " 
    print v 
    print "\nMy summary dictionary now looks like:" 
    print summary_dict[v['parent']] 

得到的字典,我想的是:

{"a": {"data": [[1, 2, 3, 4], [1, 2, 3, 4, 5]], 
     "data_len": [4, 5]}, 
"b": {"data": [[1, 2, 3], [1]], 
     "data_len": [3, 1]}} 

回答

5

你傳遞一個可變參數from_keys所以引用鍵之間複製。

創建您的字典是這樣而不是爲每個鍵創建一個單獨的參考:

summary_dict = {x : {"data": [],"data_len": []} for x in ["a","b"]} 

注意,由於該字典的順序是不能保證你得到的東西,如:

{'a': {'data_len': [5, 4], 'data': [[1, 2, 3, 4, 5], [1, 2, 3, 4]]}, 'b': {'data_len': [3, 1], 'data': [[1, 2, 3], [1]]}} 

你可以使用

for k, v in sorted(detail_dict.items()): 

對項目進行排序,因此列表中的順序是確定性的。

+0

非常感謝!我從來沒有想過自己制定出這個陷阱。我認爲這是他們肯定的方式,我正在循環中調用它 – LoveMeow

5

dict.fromkeys方法對每個值使用相同實例

summary_dict = dict.fromkeys(["a", "b"], {"data": [], "data_len": []}) 

修改字典中的一個鍵會影響所有鍵。最好僅將dict.fromkeys與默認值的不可變對象一起使用,以避免此陷阱。

試試這個字典包容來代替:

summary_dict = {k: {"data": [], "data_len": []} for k in 'ab') 
相關問題