Python - 在一个字典中更新值正在更新所有字典中的值

时间:2014-02-03 01:26:17

标签: python for-loop dictionary

我有一个名为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

3 个答案:

答案 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] = rrdictlod本身是使用不同的词典正确创建的。不幸的是,之后对列表中原始词典的任何引用都会被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所代表的对象的引用。 不确定你的代码是做什么的,但是看到一条注释掉的行 - 它可能是你正在寻找的修复。