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

8 投票
5 回答
8989 浏览
提问于 2025-04-16 11:35

我在一个列表中循环,想要删除满足我条件的元素。但是,下面的做法为什么不行呢?谢谢。

>>> 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]

5 个回答

3

过滤的想法很好,但它忽略了一个关键点,那就是有些列表可能非常大,而要删除的元素却很少。

在这种情况下,解决办法是记住要删除的元素在列表中的位置,然后按照从大到小的顺序遍历这些位置,逐个删除元素。

6

你为什么不在列表推导式中直接这样做呢?比如:

[i for i in range(4) if i <= 1 or i >= 4]

你也可以用这个方法从现有的列表中构建一个新的列表,比如:

[x for x in a if x <= 1 or x >= 4]
11

在你遍历一个东西的时候,是不能去改变它的。这会导致一些奇怪的结果,往往不是你想要的。实际上,很多集合(比如集合和字典)都明确不允许这样做。

相反,你可以遍历一个副本(比如用for e in a[:]: ...),或者与其修改一个已有的列表,不如过滤一下,得到一个新的列表,里面包含你想要的项目(比如[e for e in a if ...])。需要注意的是,在很多情况下,你不需要再遍历一次来过滤,可以把过滤和生成数据的过程合并在一起。

撰写回答