我想遍历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
答案 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)