Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在while循环中创建新的字典键_Python_Python 2.7_Loops_Dictionary_While Loop - Fatal编程技术网

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

Python 在while循环中创建新的字典键,python,python-2.7,loops,dictionary,while-loop,Python,Python 2.7,Loops,Dictionary,While Loop,我现在有一点问题,就是在循环中向字典添加键和值。它会出现以下错误: for deviceInDic in devicesDic: RuntimeError: dictionary changed size during iteration 我编写代码的原因很简单,就是从JSON文件中的键获取值,如果该键已经存在于字典中,只需在该键的值中添加一个,如果该键不存在,则添加该键作为设备名,然后再添加一个。我似乎在这里遇到了一点障碍,而谷歌帮不了多少忙 下面是我的一小段代码 devicesDic =

我现在有一点问题,就是在循环中向字典添加键和值。它会出现以下错误:

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


一如既往,请提前感谢。

您可以使用defaultdict。尝试以下代码而不是您的代码

devicesDic = defaultdict(int)
for device in jdata.values():
    devicesDic[device] += 1

您可以使用defaultdict。尝试以下代码而不是您的代码

devicesDic = defaultdict(int)
for device in jdata.values():
    devicesDic[device] += 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

尽管如此,仍然存在这样一种数据结构:a
集合。Counter

您的代码没有多大意义,因为:

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

尽管如此,仍然存在这样一种数据结构:一个
集合。计数器

您的代码没有意义:只有在第二个
for
循环之后,您才知道键不在字典中。为什么不使用
集合。计数器
?这个循环是不必要的:
for deviceInDic in devicesDic:
。只需使用
devicesDic[device]=devicesDic.get(device,0)+1
就可以摆脱该循环和
if
/
else
,它应该可以修复它。如果该键存在,则每次找到该键时,该值都将递增1。如果该键不存在,它将获得默认计数0,然后立即递增1,因此它将覆盖这两种情况。重复。在此处搜索错误消息,您将得到答案。您的代码没有意义:只有在第二次
for
循环之后,您才知道密钥不在字典中。为什么不直接使用
集合。计数器
?此循环是不必要的:
对于devicesDic:
中的deviceInDic。只需使用
devicesDic[device]=devicesDic.get(device,0)+1
就可以摆脱该循环和
if
/
else
,它应该可以修复它。如果该键存在,则每次找到该键时,该值都将递增1。如果该键不存在,它将获得默认计数0,然后立即递增1,因此它将覆盖这两种情况。重复。在这里搜索错误消息,你会得到答案。谢谢你的提示。我明白你的意思了,这没有道理。我没有意识到我可以用if语句简单地搜索字典的所有值,我想我必须进入每个字典(因为JSON在Python中是作为DIC加载的),然后比较这些值。因此,两个for循环。一旦我删除了它们并修改了代码,它就正常工作了,谢谢你的帮助:-)我试着给你投票,但因为我自己的代表分数不到15分,所以没有显示出来。我还将查看集合。计数器,因为我不知道它是一个函数。@RubenBob:它不是一个函数:它是一个建立在字典之上的数据结构,提供了方便的计数方法(你在这里的目标是做什么)。谢谢你的提示。我明白你的意思了。我没有意识到我可以用if语句简单地搜索字典的所有值,我想我必须进入每个字典(因为JSON在Python中作为DIC加载)然后比较两个值。因此这两个for循环。一旦我删除了它们并修改了代码,它就正常工作了,感谢您的帮助:-)我试着给你们投票,但因为我自己的代表分数不到15分,所以没有显示出来。我还将查看集合。请反驳,因为我不知道它是一个函数。@RubenBob:它不是一个函数:它是一个建立在字典之上的数据结构,提供了方便的方法来计算事物(你们在这里的目标是做什么)。