在循环中创建时,Dict键被覆盖

时间:2018-01-01 00:31:13

标签: python-3.x dictionary

我试图在循环输入一些输入数据时创建单独的字典条目。部分数据用于密钥,而不同部分用作与该密钥关联的值。我遇到了一个问题(由于Python' s#34;所有东西都是一个对象,你引用那个对象"操作方法),因为迭代通过我的循环改变了密钥集之前的迭代,从而覆盖先前设置的值,而不是创建新的dict键并使用自己的值设置它。

popcount = {}
for oneline of datafile:
  if oneline[:3] == "POP":
    dat1, dat2, dat3, dat4, dat5, dat6 = online.split(":")
    datid = str.join(":", [dat2, dat3])
    if datid in popcount:
      popcount[datid] += int(dat4)
    else:
      popcount = { datid : int(dat4) }

这会迭代超过七行数据(datafile是包含该信息的列表),并且应为datid创建四个单独的键,每个键都有自己的值。但是,最终发生的事情是,在运行代码时,字典中只存在datid的最后一个值。这恰好是具有重复的那个,并且它们得到了正确的求和(所以,至少我知道 代码的一部分有效,但其他关键条目正好......已经消失。

数据是从文件中读取的,冒号(:)是分开的,即使是数字(因此int()中的if datid in popcount调用),也会像字符串一样处理。 / p>

我在这里错过了什么/做错了什么?到目前为止,我还没有找到任何可以帮助我解决这个问题的东西(尽管你们已经回答了我已经遇到的其他Python问题很多,即使你已经遇到过我不知道。我知道它失败的原因;或者,我认为我这样做 - 它因为当我更新datid的值时,即使我没有',键也会指向新的datid值对象。想要它,对吗?我只是不知道如何修复或解决这种行为。说实话,这是我不喜欢用Python工作的一件事(希望一旦我理解它,我会更喜欢它;直到那时......)。

1 个答案:

答案 0 :(得分:0)

只需更改最后一行

popcount = { datid : int(dat4) } # This does not do what you want

这会创建一个新的dict并将其分配给popcount,从而丢弃以前的数据。

您要做的是向dict添加条目:

popcount[datid] = int(dat4)