2014-01-14 100 views
0

我有一個嵌套的Python字典,我試圖從列表中取值,然後遍歷他們進入一個快譯通的值,例如:增量項目

for row in rows: 
    Dict[A][AA][AAA] += 1 

然而,當我打印我的字典,它似乎是將所有增量添加到所有的Dict條目中。我的意思是,與其這樣:

{KeyA:{KeyAA:{KeyAAA:5}}} 
{KeyB:{KeyBB:{KeyBBB:10}}} 

我得到這個:

{KeyA:{KeyAA:{KeyAAA:15}}} 
{KeyB:{KeyBB:{KeyBBB:15}}} 

我有點難倒。

編輯: 這是如何創建的字典: 我第一次通過一個包含類型分類的長表瀏覽。當我這樣做時,我創建了一個新的主詞典。與此同時,我收集所有的獨特分類成subDict,這樣我可以補充這主要快譯通以後:

Dict = {} 
subDict = {} 
for row in skimRows: 
    Dict[row[0]] = {"Type":row[1],"Assoc":{}} # Save each ID and origin Type to Dict 
    if item not in subDict: # Check to see if unique item already exists in subDict 
    subDict[item] = 0 

這顯然是我要去哪裏錯了。當時我走的是subDict和plunking到主快譯通這一點,並沒有意識到插入subDict被保留了其原來的subDict對象關係:

for key in Dict: # After initial iteration and Type collection, add new subDict to each Dict key 
    Dict[key]["Assoc"] = subDict 

SOLUTION: 每下面的正確答案,我通過增加固定它.copy()

for key in Dict: # After initial iteration and Type collection, add new subDict to each Dict key 
    Dict[key]["Assoc"] = subDict.copy() 
+2

你與*相同的字典*創建了嵌套的詞典,它們是同一個對象的所有引用。你是如何創建這個結構的? –

+0

你能告訴我們你的示例代碼,這樣我們可以看到什麼是錯的 – duck

+0

'row'怎麼從未用過for塊? – astreal

回答

1

你內心的字典都是共享的,不是唯一的目標:

>>> somedict = {} 
>>> somedict['foo'] = {'bar': 0} 
>>> somedict['spam'] = somedict['foo'] 
>>> somedict['foo']['bar'] += 1 
>>> somedict['spam'] 
{'bar': 1} 
>>> somedict['foo'] is somedict['spam'] 
True 

兩個關鍵foospam這兩個在這裏指的是同一個對象,一個字典對象持有密鑰bar

您不應該重複使用這樣的字典。可以創建一個新的空dictiorary:

somedict['spam'] = {'bar': 0} 

或創建(淺)複製:

somedict['spam'] = somedict['foo'].copy()