当前位置: 首页 > 面试题库 >

如何解决字典在迭代错误时更改大小的问题?

柯琛
2023-03-14
问题内容

我想在字典中弹出所有较大的值及其键,并保持最小的值。这是我程序的一部分

for key,value in dictionary.items():
    for key1, value1 in dictionary.items(): 
            if key1!= key and value > value1:
                dictionary.pop(key)             
    print (dictionary)

导致

RuntimeError: dictionary changed size during iteration

如何避免此错误?


问题答案:

替代解决方案

如果您正在寻找字典中的最小值,则可以执行以下操作:

min(dictionary.values())

如果不能使用min,则可以使用sorted:

sorted(dictionary.values())[0]

为什么会出现此错误?

附带说明一下,您遇到的原因Runtime Error是,在内部循环中您修改了外部循环所基于的迭代器。当您pop尚未由外部循环访问的条目并且外部迭代器到达该条目时,它将尝试访问已删除的元素,从而导致错误。
如果您尝试在Python 2.7(而不是3.x)上执行代码,则实际上会得到一个Key Error

我该如何避免该错误?

如果要基于循环的 迭代 修改循环中的 迭代对象
,则应使用其深层副本。



 类似资料:
  • 问题内容: 我已经检查了所有其他问题,并发现了相同的错误,但没有找到有帮助的解决方案= / 我有一个字典列表: 其中某些值为空。创建这些列表结束时,我想在返回字典之前删除这些空列表。当前,我正在尝试执行以下操作: 但是,这给了我运行时错误。我知道您无法在字典中进行迭代时添加/删除字典中的元素…那么解决这个问题的方法是什么? 问题答案: 在Python 2.x中,调用会生成密钥的副本,您可以在修改时

  • 问题内容: 我有这样的obj 它应该扩展到 我在下面编写了代码,按拆分,删除旧键,如果包含则追加新键,但是它说 对于obj.iteritems()中的k,v: RuntimeError:词典在迭代过程中更改了大小 问题答案: 就像消息说的那样:在循环遍历expand中的这些条目的过程中,您更改了expandField()内部obj中的条目数。 您可以尝试创建所需形式的新字典,或者以某种方式记录要进

  • 问题内容: 假设我们有一个Python字典,我们正在像这样迭代它: (并且仅仅是一些黑盒转换。) 换句话说,我们尝试在使用对其进行迭代的同时向其中添加/删除项目。 这个定义好吗?您能否提供一些参考来支持您的答案? (很明显,如果损坏了该如何解决,所以这不是我所追求的角度。) 问题答案: 在python文档页面(针对2.7)上明确提到了 使用而添加或删除字典条目可能会产生一种或无法遍历所有条目。 对

  • 我正在运行一个pyspark脚本,在下面遇到了一个错误。由于我的代码“如果len(RDD.Take(1))>0:”,它似乎在说“RuntimeError:在迭代期间设置更改的大小”。我不确定这是不是真正的原因,不知道到底出了什么问题。任何帮助都将不胜感激。 谢谢! 第65行,在调用r=self.func(t,*rdds)文件“/usr/lib/spark/python/lib/pysspark.z

  • 问题内容: 在Python上进行迭代时从字典中删除项目是否合法? 例如: 这个想法是从字典中删除不满足特定条件的元素,而不是创建一个新字典,该字典是正在迭代的字典的子集。 这是一个好的解决方案吗?有没有更优雅/更有效的方法? 问题答案: 此答案不适用于,并且会给出。 :字典在迭代过程中更改了大小。 发生这种情况是因为返回的是迭代器而不是列表。正如评论中指出的那样,只需将其转换为列表即可,它应该可以

  • 问题内容: 在Python上进行迭代时从字典中删除项目是否合法? 例如: 这个想法是从字典中删除不满足特定条件的元素,而不是创建一个新字典,该字典是正在迭代的字典的子集。 这是一个好的解决方案吗?有没有更优雅/更有效的方法? 问题答案: 此答案不适用于,并且会给出。 :字典在迭代过程中更改了大小。 发生这种情况是因为返回的是迭代器而不是列表。正如评论中指出的那样,只需将其转换为列表即可,它应该可以