摘要:
我想遍历动态字典。
这里动态的意思是我们将在某些条件后删除一个键,值对。因此,字典的长度将被改变。 但是我在python中遇到错误:
RuntimeError: dictionary changed size during iteration
示例:
在这里有一个代码:
a = {'p':'q','q':'r','s':'t'}
for key,value in a.items():
if key == 'q':
<some code here>
del a[key]
<some code here>
它在更改字典大小时给出运行时错误。
答案 0 :(得分:2)
在迭代key
时不要删除dict
。使用dict理解来创建新的dict,并在需要时将其分配给变量a
{k:v for k,v in a.items() if k!='q'}
答案 1 :(得分:1)
您并没有真正使用那里的值,因此您可以复制键并通过执行此操作获得相同的行为-
a = {'p':'q','q':'r','s':'t'}
for key in list(a):
if key == 'q':
<some code here>
del a[key]
<some code here>
答案 2 :(得分:0)
是的,迭代时无法更改字典的大小。
我建议创建字典副本,从副本中删除元素,然后进行正确分配。
请确保使用dict.copy()进行复制,否则代码将无法正常工作
a = { 'a' : 1, 'b' : 2, 'c' : 3 }
b = a.copy()
for key in a:
if i=='a':
del [key]
a = b
享受!
答案 3 :(得分:0)
items()
方法返回一个生成器,该生成器将为每个迭代步骤返回一个元组(key, value)
,直到将其提高和StopIteration
为止。请参阅iterator protocol。
您可以通过执行list(a.items())
将生成器转换为列表,然后它将起作用,因为现在您拥有键和值的整个列表,并且不再与字典链接。