如何在迭代时从列表中删除项目?
我遍历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