循环创建Python字典时键被覆盖问题求助
问题分析与解决方案
嘿,我一眼就发现你代码里的问题啦!
你遇到的核心问题在于else分支的赋值逻辑错误:每次遇到新的datid时,你没有往已经存在的popcount字典里添加新的键值对,而是直接把popcount变量重新赋值成了一个只包含当前datid的新字典!这就导致之前循环积累的所有数据都被直接覆盖清空,最后自然只剩最后一条记录的内容。
错误代码片段对比
原来的错误逻辑:
else: popcount = { datid : int(dat4) } # 直接替换整个字典,丢弃之前的数据
修正后的代码
只需要把else分支的代码改成往原字典中添加键值对即可,另外我还帮你修正了两处笔误:
popcount = {} for oneline in datafile: # 原代码写的是of,修正为in if oneline[:3] == "POP": dat1, dat2, dat3, dat4, dat5, dat6 = oneline.split(":") # 原代码写的是online,修正为oneline datid = ":".join([dat2, dat3]) # str.join可以简化成":".join写法 if datid in popcount: popcount[datid] += int(dat4) else: popcount[datid] = int(dat4) # 往原字典添加新键值对,而非替换整个字典
更简洁的写法(可选)
你还可以用字典的get()方法来简化if-else逻辑,一行完成累加操作,代码更清爽:
popcount = {} for oneline in datafile: if oneline[:3] == "POP": _, dat2, dat3, dat4, _, _ = oneline.split(":") # 用下划线忽略不需要的变量 datid = ":".join([dat2, dat3]) popcount[datid] = popcount.get(datid, 0) + int(dat4)
get(datid, 0)的意思是:如果datid在字典中,就返回它对应的值;如果不存在,就返回默认值0,这样就不用单独判断键是否存在了。
补充说明
你之前猜测和Python对象引用有关,其实方向是对的——原来的else分支中,你让popcount变量指向了一个新的字典对象,原来的字典对象因为没有被引用就被垃圾回收了。而正确的做法是修改同一个字典对象的内容,这样才能保留之前积累的数据。
内容的提问来源于stack exchange,提问作者krenshala
相关产品推荐
相关产品推荐

