2013-02-23 36 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]]}