遍历动态字典

时间:2019-03-14 13:47:11

标签: python python-3.x

摘要

我想遍历动态字典。

这里动态的意思是我们将在某些条件后删除一个键,值对。因此,字典的长度将被改变。 但是我在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>

它在更改字典大小时给出运行时错误。

4 个答案:

答案 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())将生成器转换为列表,然后它将起作用,因为现在您拥有键和值的整个列表,并且不再与字典链接。