2014-04-30 171 views
1

首先,我無法找到任何建議來解決我的下一個問題,所以如果有人已經回覆了它,請善待我來解決這個問題。我試圖「動態」創建由其他字典組成的字典,(這些最後一個是通過JSON獲得的數據);反正我想要達到的效果是:python動態創建字典

{ 
'D2Key1': {'D1Key1': 'Data11', 'D1Key2': 'Data21', 'D1Key3': 'Data31'}, 
'D2Key2': {'D1Key1': 'Data12', 'D1Key2': 'Data22', 'D1Key3': 'Data32'}, 
'D2Key3': {'D1Key1': 'Data13', 'D1Key2': 'Data23', 'D1Key3': 'Data33'} 
} 

我寫的代碼是:

for n in range(3): 
    D1['D1key1'] = pjson['jsonkey1'][n]['jsonkey4'] # Data1n 
    D1['D1key2'] = pjson['jsonkey2'][n]['jsonkey5'] # Data2n 
    D1['D1key3'] = pjson['jsonkey3'][n]['jsonkey6'] # Data3n 

    D2['%s%d' % ('D2key', n+1)] = D1 

結果我得到的是填充有三個字典詞典,但所有的人都在相同的數據,從最後一次迭代的,換句話說是這樣的:

{ 
'D2Key1': {'D1Key1': 'Data13', 'D1Key2': 'Data23', 'D1Key3': 'Data33'}, 
'D2Key2': {'D1Key1': 'Data13', 'D1Key2': 'Data23', 'D1Key3': 'Data33'}, 
'D2Key3': {'D1Key1': 'Data13', 'D1Key2': 'Data23', 'D1Key3': 'Data33'} 
} 

有人可以解決我在正確的方向? 謝謝

+0

pjson究竟是什麼? – acushner

回答

1

是的,如果你這樣做,你必須在每次通過後重置D1,否則指針保持不變,並且你將D2中的所有按鍵指向同一個D1。以下是修復方法:

for n in range(3): 
    D1 = {} 
    D1['D1key1'] = pjson['jsonkey1'][n]['jsonkey4'] # Data1n 
    D1['D1key2'] = pjson['jsonkey2'][n]['jsonkey5'] # Data2n 
    D1['D1key3'] = pjson['jsonkey3'][n]['jsonkey6'] # Data3n 

    D2['%s%d' % ('D2key', n+1)] = D1 
+0

感謝Eli給你和所有其他人給予及時的答覆。 r08y – r08y

1

這是一個常見錯誤。 D2中的每個鍵被分配給相同的對象D1。然後你每次迭代都要修改D1。

您想要爲每次迭代分配一個不同的詞典。在for循環的第一行添加D1 = {}

1

這可能是因爲您指的是for循環中相同的dict D1。我認爲你必須在每次迭代中創建新的字典。事情是這樣的:

for n in range(3): 
    D1 = {} 
    D1['D1key1'] = pjson['jsonkey1'][n]['jsonkey4'] # Data1n 
    D1['D1key2'] = pjson['jsonkey2'][n]['jsonkey5'] # Data2n 
    D1['D1key3'] = pjson['jsonkey3'][n]['jsonkey6'] # Data3n 

    D2['%s%d' % ('D2key', n+1)] = D1 
0

此行

D2['%s%d' % ('D2key', n+1)] = D1 

是錯誤的。你總是指向可變類型的字典。您需要先複製結果並將其添加到字典D2中。

嘗試此操作,在每個循環中創建一個新詞典的位置,填充鍵,然後將其添加到字典D2。

for n in range(3): 
    d1 = {} # notice here this is what you need to add. 
    d1['D1key1'] = pjson['jsonkey1'][n]['jsonkey4'] # Data1n 
    d1['D1key2'] = pjson['jsonkey2'][n]['jsonkey5'] # Data2n 
    d1['D1key3'] = pjson['jsonkey3'][n]['jsonkey6'] # Data3n 
    d2['%s%d' % ('D2key', n+1)] = d1