【问题标题】:Python - Updating value in one dictionary is updating value in all dictionariesPython - 在一个字典中更新值正在更新所有字典中的值
【发布时间】:2014-02-03 01:26:16
【问题描述】:

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

我做错了什么?

这是我声明字典列表的方式:

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

【问题讨论】:

  • 请发布更完整的代码。什么是datakl? rrdict 是如何初始化的?您确定要在第一个代码片段中索引 lov[i] 吗?一些数据样本也会大大提高问题的质量。

标签: python for-loop dictionary


【解决方案1】:

问题在于您如何创建字典列表。你可能做了这样的事情:

list_of_dicts = [{}] * 20

这实际上是 相同 dict 20 次。尝试做这样的事情:

list_of_dicts = [{} for _ in range(20)]

没有看到您实际创建它的方式,这只是示例问题的示例解决方案。

要确定,请打印:

[id(x) for x in list_of_dicts]

如果您在* 20 方法中定义它,则id 对于每个dict 都是相同的。在列表推导方法中,id 是唯一的。

【讨论】:

  • 好的,感谢您的快速回复。我的每个身份证都是一样的。但是,我尝试按照您建议的方式声明 list_of_dicts,但我仍然有相同的 dicts。
【解决方案2】:

这就是麻烦开始的地方: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:]

【讨论】:

    【解决方案3】:

    根据其他答案,您正确创建了字典列表。 但是,当您更新单个词典时,您会完全覆盖列表。 从您的代码 sn-p 中去除噪音:

    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] 中的空 dict,并插入了对 rrdict 表示的对象的引用。 不确定您的代码做了什么,但请查看已注释掉的行 - 这可能是您正在寻找的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-18
      • 2022-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多