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

bod*_*ydo 4 python

假设我有一个数字列表:

L = [1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

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

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

for el in L:
  if el == 3:
    del el
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

谢谢,Boda Cydo.

Ale*_*lli 13

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

L[:] = [el for el in L if el != 3]
Run Code Online (Sandbox Code Playgroud)

列表理解建立所需的列表,并分配到"全名单切片" L[:],确保你只是一个重新绑定的名字,但完全替换内容,所以效果是相同等于"清除"你想执行.这也很快.

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

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

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

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

for i in reversed(range(len(L))):
  if L[i] == 3: del L[i]
Run Code Online (Sandbox Code Playgroud)

事实上,reversed当我们在讨论是否添加内置reversed(range(...函数时,这是一个主要的用例- 在没有这些内容的情况下获取是非常简单的reversed,并且以相反顺序循环列表有时是有用的.替代方案

for i in range(len(L) - 1, -1, -1):
Run Code Online (Sandbox Code Playgroud)

很容易出错;-).

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