假设我有一个数字列表:
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看起来越来越好,因为检查了替代方案,不是吗? - ).