我想在for循环中删除字典中的某些项目,然后我按照此How to delete items from a dictionary while iterating over it?
中的代码进行操作循环.keys
:
b = {'a':1, 'b' : 2}
for k in b.keys():
if b[k] == 1:
del b[k]
结果:
Traceback (most recent call last):
File "<input>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
b
{'b': 2}
同样,循环遍历.items()
:
b = {'a':1, 'b' : 2}
for k, v in b.items():
if v == 1:
del b[k]
Traceback (most recent call last):
File "<input>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
b
{'b': 2}
在循环之后,它返回正确的结果,但RuntimeError
也被引发,我该如何解决?
答案 0 :(得分:3)
您使用d
更改del d[k]
,因此迭代它.keys
或.values
没有任何区别,您更改了底层迭代器,因此它会抱怨。< / p>
您可以list
.keys
,list(b)
或.items
,list(b.items())
,基本上将它们复制到新的迭代器与您正在改变的词典无关:
# list(b) would suffice instead of .keys
for k in list(b.keys()):
if b[k] == 1:
del b[k]
或者,使用字典理解:
d = {k:b[k] for k in b if b[k] != 1}
过滤掉不需要的元素。
答案 1 :(得分:2)
在迭代它时,您无法删除dict
中的元素。
最好的方法是使用dict
理解:
b = {'a':1, 'b' : 2}
b = {k: v for k, v in b.items() if v != 1}
您还可以在迭代它时复制dict
:
b = {'a':1, 'b' : 2}
for k, v in dict(b).items():
if v == 1:
del b[k]
在这里,您在修改原始b
时正在迭代b
的副本,这就是它工作的原因:您永远不会从副本中删除元素。