如何在遍历键的同时在列表中进行迭代的同时更改字典

时间:2019-01-12 16:41:11

标签: python python-3.x dictionary for-loop iteration

    我有一个清单l。
  1. 我有字典d。

我想遍历l。对于任何列表项,我都想遍历d.keys。

如果满足某些条件,我想“更新”我的字典。

我天真地尝试嵌套两个for循环并放入一个if语句-一个不能更改被迭代对象的长度。

d = {'this': '1', 'is': '2', 'a': '3', 'list': '4'}

l = ['A', 'B', 'C', 'D', 'E']

for word in l:
    for key in d.keys():
        if len(key) < 2:#some condition
            d.pop(key)
        else:
            print(word, key)

这是我得到的输出:

A this
A is
Traceback (most recent call last):
  File "untitled3.py", line 6, in <module>
    for key in d.keys():
RuntimeError: dictionary changed size during iteration

2 个答案:

答案 0 :(得分:2)

在迭代字典视图时,请勿更改字典的大小。您可以改为构建新的词典,然后任意打印然后。例如:

d = {'this': '1', 'is': '2', 'a': '3', 'list': '4'}
L = ['A', 'B', 'C', 'D', 'E']

d_new = {k: v for k, v in d.items() if len(k) >= 2}

for word in L:
    for key in d_new:
        print(word, key)

the docs中所述:

  

dict.keys()dict.values()和   dict.items()是视图对象。他们提供了关于   字典的条目,这意味着当字典更改时,   该视图反映了这些变化。   在添加或删除字典中的条目时迭代视图可能   引发RuntimeError或无法迭代所有条目。

答案 1 :(得分:2)

您可以遍历副本而不是遍历d

d = {'this': '1', 'is': '2', 'a': '3', 'list': '4'}

l = ['A', 'B', 'C', 'D', 'E']

for word in l:
    for key in d.copy().keys(): # Notice the change
        if len(key) < 2:#some condition
            d.pop(key)
        else:
            print(word, key)