如何在Python中迭代元素时从列表中删除元素?

假设我有一个数字列表:

L = [1, 2, 3, 4, 5]

当我迭代它时,如何从列表中删除一个元素,比方说3?

我尝试了以下代码,但它没有这样做:

for el in L:
  if el == 3:
    del el

有任何想法吗?

谢谢,Boda Cydo.

最佳答案
最好通常是建设性地进行 – 建立你想要的项目的新列表,而不是删除那些你没有的项目.例如.:

L[:] = [el for el in L if el != 3]

列表推导构建了所需的列表和对“整个列表切片”的赋值,L [:],确保您不仅仅重新绑定名称,而是完全替换内容,因此效果与“删除”完全相同“你想表演.这也很快.

如果您绝对不惜一切代价必须进行删除,那么一种微妙的方法可能会起作用:

>>> ndel = 0
>>> for i, el in enumerate(list(L)):
...    if el==3:
...      del L[i-ndel]
...      ndel += 1

像listcomp方法一样优雅,干净,简单或表现良好,但它确实起作用(虽然它的正确性乍一看并不明显,实际上我在编辑之前做错了! – ). “不惜任何代价”适用于此;-).

代替项目的指数循环是“必须删除”案例的另一种低劣但可行的方法 – 但是请记住在这种情况下反转指数……:

for i in reversed(range(len(L))):
  if L[i] == 3: del L[i]

事实上,当我们讨论是否添加内置 – 反转(范围(……在没有反转的情况下获得并不容易,并且有时以相反的顺序循环)时,这是反转的主要用例有用的.替代方案

for i in range(len(L) - 1, -1, -1):

很容易出错;-).

不过,我在这个答案开头推荐的listcomp看起来越来越好,因为检查了替代方案,不是吗? – ).

转载注明原文:如何在Python中迭代元素时从列表中删除元素? - 代码日志