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

新手上路,请多包涵

我正在 Python 中迭代一个元组列表,如果它们满足特定条件,我将尝试删除它们。

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

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

原文由 lfaraone 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 247
2 个回答

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

 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)

原文由 David Raznick 发布,翻译遵循 CC BY-SA 4.0 许可协议

建议列表理解的答案几乎是正确的——除了他们构建了一个全新的列表,然后给它一个与旧列表相同的名称,他们没有修改旧列表。这与您通过选择性删除所做的不同,如 @Lennart 的建议- 它更快,但如果您的列表是通过多个引用访问的,那么您只是重新设置其中一个引用而不是更改列表对象本身会导致微妙的、灾难性的错误。

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

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

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

原文由 Alex Martelli 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题