【问题标题】:Creating new dictionary keys in a while Loop在while循环中创建新的字典键
【发布时间】: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


【解决方案1】:

您可以使用默认字典。尝试以下代码而不是您的代码。

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

【讨论】:

    【解决方案2】:

    从这里开始,您的代码没有多大意义:

    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] = <b>devicesDic.get(device,0)</b>+1

    尽管如此,仍然存在一个数据结构:collections.Counter

    【讨论】:

    • 感谢您的提示。我明白你的意思是没有意义的。我没有意识到我可以简单地使用 if 语句搜索字典的所有值,我认为我必须进入每个字典(因为 JSON 在 Python 中作为 DIC 加载)然后比较这些值。因此有两个 for 循环。一旦我删除了它们并修改了我的代码,它就可以正常工作了,感谢您的帮助:-) 我试图给你一个赞成票,但由于我自己的代表点少于 15 个,所以它没有显示。
    • 我还会查看 collections.Counter 因为我不知道它是一个函数。
    • @RubenBob:它不是一个函数:它是一个建立在字典之上的数据结构,提供了方便的方法来计算事物(你在这里的目标是做什么)。
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 2018-04-18
    • 2019-11-23
    • 2019-06-08
    • 2021-03-24
    • 2011-03-05
    • 2019-03-01
    • 2019-09-17
    相关资源
    最近更新 更多