2013-02-23 140 views
0

我想創造使用循環字典詞典(DofD)。在循環中,我的「subdict」變量將被置,然後用新名稱添加DofD。創建類型的字典詞典:循環

我從文件中讀取,帶分隔符的內容分割成塊,「####」,即分開我想在每個子字典。我根據塊中的一個字段來命名DofD中的每個條目。

我很困惑,因爲我的輸出DofD已經正確命名的項目,但所有跨subdicts的信息是相同的。所有的值都反映了最後一個子字典的內容。

idxs=[i for i,val in enumerate(fileContents) if val=='####\r\n'] 
paramsDict={} 
for i in range(len(idxs)): 
    pos=idxs[i] 
    if i < len(idxs)-1: endLine=idxs[i+1]+1 # watch out for end of file 
    else: endLine=len(fileContents) 
    blockForSubDict=fileContents[idxs[i]+1:endLine] 

    paramsDict[blockForSubDict[0].split()[0]]={'Name': blockForSubDict[0].split()[0], 'Values' : [float(x.replace('\r\n','')) for x in blockForSubDict[5:lenBlock]]} 

我制定了一個例子手工創建詞典的詞典,以確保我沒有做我的語法一個奇怪的現象:

d1={'Name': 'name1', 'Value': 30} 

d2={'Name': 'name2', 'Value': 29} 

d3={} 
d3[d1['Name']]=d1 
d3[d2['Name']]=d2 

d3 

{「名1」:{」名稱 ': '名稱1', '值':30}, '名2':{' 名稱「: '名2', '值':29}}

這個工作。

我有什麼在循環搞砸?

+10

這不是一個問題 - 你應該改變它實際上是一個問題,然後按[自己回答吧](http://blog.stackoverflow.com/2011/07/ITS-OK-到問一答,你自己的問題/)。 – Volatility 2013-02-23 00:07:27

+1

轉換爲問題格式。 – Roland 2013-02-28 23:38:53

回答

1

那麼,問題是,在我的DofD條目實際上只是在我的循環的subdict引用。這意味着我的DofD只有一堆不同名稱的條目,都指向相同的子字段。子代碼的內容隨着每次迭代而改變,並且最終反映了通過我的循環的最後一次的塊值。因此,我的DofD中的所有條目都顯示了這組相同的子字段值。

與其在每次迭代中創建一個不同名稱的子代碼,我決定將deepcopy()的子代碼放到DofD中,以便每個條目保持其獨特的內容。

我的代碼現在看起來是這樣的:

import copy 
    ... 
    paramsDict[blockForSubDict[0].split()[0]]={'Name': 
    copy.deepcopy(blockForSubDict[0].split()[0]), 
    'Values' : 
    [copy.deepcopy(float(x.replace('\r\n',''))) for x in blockForSubDict[5:lenBlock]]}