如何安全地从Python列表中移除元素
我在一个列表中循环,想要删除满足我条件的元素。但是,下面的做法为什么不行呢?谢谢。
>>> 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 ...]
)。需要注意的是,在很多情况下,你不需要再遍历一次来过滤,可以把过滤和生成数据的过程合并在一起。