【发布时间】:2017-07-18 03:54:31
【问题描述】:
我现在在循环中向我的字典添加键和值时遇到了一些问题。它出现以下错误:
for deviceInDic in devicesDic:
RuntimeError: dictionary changed size during iteration
我的代码的原因很简单,它从 JSON 文件中的键获取值,如果键已经存在于字典中,只需在该键的值上加一,如果不存在,添加键作为设备名称并添加一个。我似乎在这里遇到了一些障碍,而谷歌并没有提供太多帮助。
这是我的代码的一个小sn-p。
devicesDic = {'duck_waxer' : 0}
x = int(0)
#y = x
y = True
while y == True:
try:
jdata = data["result"]["items"][0]["tagValues"]["IdDevicesMap"]["value"]
for device in jdata.values():
for deviceInDic in devicesDic:
if deviceInDic == device:
devicesDic[device] += 1
else:
print 'else'
devicesDic[device] = 1
except KeyError:
#noValues += 1
pass
except IndexError:
break
print devicesDic
y = False
目前这只是一个遍历 JSON 文件第一个条目的小循环,最终它将遍历 JSON 文件中的所有条目。
一如既往,提前致谢。
【问题讨论】:
-
您的代码没有意义:只有在第二个
for循环之后,您才知道字典中的键不是。 -
你为什么不直接使用
collections.Counter? -
这个循环是不必要的:
for deviceInDic in devicesDic:。你可以用devicesDic[device] = devicesDic.get(device, 0) + 1摆脱那个循环和if/else,它应该可以修复它。如果 key 存在,则每次找到该值都会增加 1。如果键不存在,则默认计数为 0,然后立即增加 1,因此它涵盖了这两种情况。 -
重复。在 SO 上搜索此处的错误消息,您将得到答案。
标签: python python-2.7 loops dictionary while-loop