我有一个名为lod
的词典列表。所有词典都具有相同的键但具有不同的值。我正在尝试更新所有词典中相同键的值列表中的一个特定值。
我正在尝试使用以下for循环:
for i in range(len(lod)):
a=lod[i][key][:]
a[p]=a[p]+lov[i]
lod[i][key]=a
正在发生的事情是每个字典都会更新len(lod)
次,因此lod[0][key][p]
应该添加lov[0]
,但它会添加lov[0]+lov[1]+....
我做错了什么?
以下是我如何宣布dicts列表:
lod = [{} for _ in range(len(dataul))]
for j in range(len(dataul)):
for i in datakl:
rrdict[str.split(i,',')[0]]=list(str.split(i,',')[1:len(str.split(i,','))])
lod[j]=rrdict
答案 0 :(得分:3)
问题在于您如何创建字典列表。你可能做过这样的事情:
list_of_dicts = [{}] * 20
实际上相同 dict
20次。尝试做这样的事情:
list_of_dicts = [{} for _ in range(20)]
如果没有看到您实际创建它的方式,这只是示例问题的示例解决方案。
要确定,请打印:
[id(x) for x in list_of_dicts]
如果您使用* 20
方法对其进行了定义,则每个id
的{{1}}都相同。在列表推导方法中,dict
是唯一的。
答案 1 :(得分:1)
这就是故障开始的地方:lod[j] = rrdict
。 lod
本身是使用不同的词典正确创建的。不幸的是,之后对列表中原始词典的任何引用都会被rrdict
的引用覆盖。所以最后,列表只包含对一个字典的引用。这里有一些更加pythonic和可读的方法来解决你的问题:
lod = [{} for _ in range(len(dataul))]
for rrdict in lod:
for line in datakl:
splt = line.split(',')
rrdict[splt[0]] = splt[1:]
答案 2 :(得分:0)
根据其他答案,您正确创建了词典列表。 但是,当您更新单个词典时,您将完全覆盖该列表。 从代码段中删除噪音:
lod = [{} for _ in range(whatever)]
for j in range(whatever):
# rrdict = lod[j] # Uncomment this as a possible fix.
for i in range(whatever):
rrdict[somekey] = somevalue
lod[j] = rrdict
最后一行的赋值抛弃了lod [j]中的空字典,并插入了对rrdict所代表的对象的引用。 不确定你的代码是做什么的,但是看到一条注释掉的行 - 它可能是你正在寻找的修复。