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

我遍历Python中的元组列表,并试图在符合特定条件时将其删除。

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

我应该用什么来代替code_to_remove_tup ? 我无法弄清楚如何以这种方式去除物品。


您可以使用列表理解来创建一个仅包含您不想删除的元素的新列表:

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

或者,通过分配片段somelist[:] ,可以对现有列表进行变异以仅包含所需的项目:

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

如果有其他需要反映变化的somelist引用,这种方法可能会很有用。

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

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

或者在Python 3中:

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

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

幸运的是,获得列表理解的速度以及就地改变所需的语义非常容易 - 只需编码:

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

注意与其他答案的细微区别:这不是指定给一个裸号 - 它分配给一个列表片,恰好是整个列表,从而替换同一个Python列表对象中的列表内容,而不是仅仅重新设置一个参考(从之前的列表对象到新的列表对象)与其他答案一样。


您需要先获取列表的副本并对其进行迭代,否则迭代将会失败,并可能导致意外的结果。

例如(取决于什么类型的列表):

for tup in somelist[:]:
    etc....

一个例子:

>>> somelist = range(10)
>>> for x in somelist:
...     somelist.remove(x)
>>> somelist
[1, 3, 5, 7, 9]

>>> somelist = range(10)
>>> for x in somelist[:]:
...     somelist.remove(x)
>>> somelist
[]
链接地址: http://www.djcxy.com/p/2963.html

上一篇: How to remove items from a list while iterating?

下一篇: How do I call one constructor from another in Java?