如何在for循环中删除字典中的元素

时间:2016-12-06 10:22:50

标签: python python-3.x dictionary

我想在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也被引发,我该如何解决?

2 个答案:

答案 0 :(得分:3)

您使用d更改del d[k],因此迭代它.keys.values没有任何区别,您更改了底层迭代器,因此它会抱怨。< / p>

您可以list .keyslist(b).itemslist(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的副本,这就是它工作的原因:您永远不会从副本中删除元素。