0

我想使用循环创建字典词典(DofD)。在循环内部,我的“subdict”变量将被设置,然后用新名称添加到 DofD。

我从文件中读取,根据分隔符“####”将内容拆分为块,该分隔符将每个子字典中我想要的内容分开。我根据块中的一个字段命名 DofD 中的每个条目。

我很困惑,因为我的输出 DofD 有正确命名的条目,但是子目录中的所有信息都是相同的。所有值都反映了最后一个子字典的内容。

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

{'name1':{'Name':'name1','Value':30},'name2':{'Name':'name2','Value':29}}

这行得通。

我在循环中搞砸了什么?

4

1 回答 1

1

所以,问题是我的 DofD 中的条目实际上只是对我循环中的 subdict 的引用。这意味着我的 DofD 只是有一堆不同名称的条目,它们都指向同一个 subdict。subdict 的内容随着每次迭代而变化,最终通过我的循环反映了最后一次的块值。因此,我的 DofD 中的所有条目都显示了同一组 subdict 值。

我决定将 subdict 的 deepcopy() 放入 DofD 中,而不是在每次迭代中创建一个不同命名的 subdict,以便每个条目都保持其独特的内容。

我的代码现在看起来像:

    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]]}
于 2013-03-01T17:22:39.970 回答