如何避免“RuntimeError:迭代期间字典更改大小”错误?

新手上路,请多包涵

我检查了所有其他具有相同错误的问题,但没有找到有用的解决方案 =/

我有一个列表字典:

 d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}

其中一些值为空。在创建这些列表结束时,我想在返回我的字典之前删除这些空列表。目前我正在尝试按如下方式执行此操作:

 for i in d:
    if not d[i]:
        d.pop(i)

但是,这给了我运行时错误。我知道您在遍历字典时无法在字典中添加/删除元素……那么有什么办法解决这个问题?


有关这可能导致问题的引用以及原因,请参阅 在迭代 Python 字典时对其进行修改

原文由 user1530318 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

在 Python 3.x 和 2.x 中,您可以使用 list 强制复制密钥:

 for i in list(d):

在 Python 2.x 中调用 keys 复制了您可以在修改 dict 时迭代的键:

 for i in d.keys():

但请注意,在 Python 3.x 中,第二种方法对您的错误没有帮助,因为 keys 返回一个 视图对象,而不是将键复制到列表中。

原文由 Mark Byers 发布,翻译遵循 CC BY-SA 4.0 许可协议

您只需要使用 copy

通过这种方式,您可以遍历原始字典字段并即时更改所需的字典 d 。它适用于每个 Python 版本,因此更加清晰。

 In [1]: d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}

In [2]: for i in d.copy():
   ...:     if not d[i]:
   ...:         d.pop(i)
   ...:

In [3]: d
Out[3]: {'a': [1], 'b': [1, 2]}

(顺便说一句 - 通常迭代你的数据结构的副本,而不是使用 .copy 用于字典或切片 [:] 对于列表,你可以使用 import copy copy.copy > --- (for shallow copy which is equivalent to copy that is supported by dictionaries or slicing [:] that is supported by lists) or copy.deepcopy on你的数据结构。)

原文由 Alon Elharar 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题