如何在迭代时从列表中删除项目?

2022-09-05 01:14:44

我正在迭代Python中的元组列表,并尝试在它们满足某些条件时删除它们。

for tup in somelist:
    if determine(tup):
         code_to_remove_tup

我应该用什么来代替 ?我不知道如何以这种方式删除该项目。code_to_remove_tup


答案 1

您可以使用列表推导式创建一个新列表,其中仅包含您不想删除的元素:

somelist = [x for x in somelist if not determine(x)]

或者,通过分配给切片 ,可以改变现有列表以仅包含所需的项目:somelist[:]

somelist[:] = [x for x in somelist if not determine(x)]

如果有其他参考资料需要反映这些变化,这种方法可能是有用的。somelist

除了理解之外,您还可以使用 。在 Python 2 中:itertools

from itertools import ifilterfalse
somelist[:] = ifilterfalse(determine, somelist)

或者在Python 3中:

from itertools import filterfalse
somelist[:] = filterfalse(determine, somelist)

答案 2

建议列表推导的答案几乎是正确的 - 除了他们构建一个全新的列表,然后给它一个与旧列表相同的名称,他们不会修改旧列表。这与你通过选择性删除所做的不同,就像@Lennart的建议一样 - 它更快,但是如果你的列表是通过多个引用访问的,那么你只是重新插入其中一个引用而不改变列表对象本身的事实可能会导致微妙的,灾难性的错误。

幸运的是,很容易获得列表理解的速度和就地更改所需的语义 - 只需代码:

somelist[:] = [tup for tup in somelist if determine(tup)]

请注意与其他答案的细微区别:这个答案不是分配给裸名 - 它分配给恰好是整个列表的列表切片,从而替换同一Python列表对象中的列表内容,而不是像其他答案一样只是重新放置一个引用(从以前的列表对象到新的列表对象)。