如何在Python中安全地从列表中删除元素

Mar*_*n08 7 python iterator list

我遍历一个列表并删除满足我条件的元素.但是,为什么这不起作用,如下所述?谢谢.

>>> a=[ i for i in range(4)]
>>> a
[0, 1, 2, 3]
>>> for e in a:
...     if (e > 1) and (e < 4):
...         a.remove(e)
... 
>>> a
[0, 1, 3]
>>> a=[ i for i in range(4)]
>>> for e in a:
...     if (e > -1) and (e < 3):
...         a.remove(e)
... 
>>> a
[1, 3]
Run Code Online (Sandbox Code Playgroud)

小智 10

在迭代时你无法改变某些东西.结果很奇怪,反直觉,几乎不是你想要的.实际上,许多集合明确地禁止这样做(例如set和dicts).

相反,迭代复制(for e in a[:]: ...)或,而不是修改现有列表,过滤它以获得包含所需项目的新列表([e for e in a if ...]).请注意,在许多情况下,您不必再次迭代进行过滤,只需将过滤与数据生成合并即可.


Raf*_*ler 6

你为什么不在列表理解中最初这样做?例如

[i for i in range(4) if i <= 1 or i >= 4]
Run Code Online (Sandbox Code Playgroud)

您也可以使用它从现有列表构建新列表,例如

[x for x in a if x <= 1 or x >= 4]
Run Code Online (Sandbox Code Playgroud)