我现在遇到一个问题,即在循环中将键和值添加到我的字典中。它出现以下错误:
for deviceInDic in devicesDic:
RuntimeError: dictionary changed size during iteration
我的代码的原因很简单,它是从JSON文件中的键获取值,如果键已经存在于字典中,只需将该键添加到该键的值,如果它不存在,则添加键作为设备名称,也可以添加一个。我似乎在这里遇到了障碍,谷歌并没有太多帮助。
以下是我的代码的一小部分内容。
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文件中的所有条目。
一如既往,提前谢谢。
答案 0 :(得分:2)
您可以使用defaultdict。请尝试使用以下代码而不是您的代码。
devicesDic = defaultdict(int)
for device in jdata.values():
devicesDic[device] += 1
答案 1 :(得分:1)
你的代码没有多大意义,因为这里:
for deviceInDic in devicesDic:
if deviceInDic == device:
devicesDic[device] += 1
else:
print 'else'
devicesDic[device] = 1
如果其中一个键不相等,则立即向字典添加元素。但它仍然可能是钥匙位于其他地方。
您可以使用以下方法解决此问题:
if device in devicesDic:
devicesDic[device] += 1
else:
devicesDic[device] = 1
甚至更优雅(没有if
):
devicesDic[device] = devicesDic.get(device,0)+1
然而,存在一个数据结构:collections.Counter
。