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

时间:2010-03-14 15:36:38

标签: python

假设我有一个数字列表:

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

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

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

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

有什么想法吗?

谢谢,Boda Cydo。

2 个答案:

答案 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]