在while循环中创建新的字典键

时间:2017-02-27 13:47:12

标签: python python-2.7 loops dictionary while-loop

我现在遇到一个问题,即在循环中将键和值添加到我的字典中。它出现以下错误:

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文件中的所有条目。

一如既往,提前谢谢。

2 个答案:

答案 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