假设我有一个数字列表:
L = [1, 2, 3, 4, 5]
如何在迭代时从列表中删除一个元素,比方说3?
我尝试了以下代码,但没有这样做:
for el in L:
if el == 3:
del el
有什么想法吗?
谢谢,Boda Cydo。
答案 0 :(得分:13)
最好通常是建设性地进行 - 建立你想要的项目的新列表,而不是删除那些你没有的项目。 E.g:
L[:] = [el for el in L if el != 3]
列表理解构建所需的列表并分配到“整个列表切片”L[:]
,确保您不只重新绑定名称,但完全替换< em> contents ,因此效果与您想要执行的“删除”相同。这也很快。
如果您绝对不惜一切代价必须进行删除,那么一种微妙的方法可能会有效:
>>> 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]
当我们讨论是否添加内置内容时,这确实是reversed
的主要用例 - reversed(range(...
在没有reversed
的情况下获得并不是一件容易的事,并且以相反的顺序循环列表有时是有用的。替代
for i in range(len(L) - 1, -1, -1):
很容易出错; - )。
尽管如此,我在这个答案开头时推荐的listcomp看起来越来越好,因为检查了替代方案,不是吗? - )。
答案 1 :(得分:-4)
for el in L:
if el == 2:
del L[el]