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

假设我有一个数字列表:

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

我如何从列表中删除一个元素,让我们说3,而我迭代它?

我试过下面的代码,但它没有这样做:

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

有任何想法吗?

谢谢,Boda Cydo。

最好的方式通常是build设性地build设 – build立你想要的项目的新列表,而不是删除你不想要的项目。 例如:

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

列表理解build立所需的列表和赋值给“全列表分片” L[:] ,确保你只是重新绑定一个名字,而是完全replace内容 ,所以这个效果和“清除” “你想表演。 这也很快。

如果你绝对,不惜一切代价, 必须做删除,一个微妙的方法可能工作:

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

没有一个像listcomp方法那样优雅,干净,简单或者performance良好,但是它确实做了这个工作(虽然它的正确性乍一看并不明显,事实上在编辑之前我错了)。 “不惜一切代价”在这里适用;-)。

通过循环索引代替物品是“必须删除”的另一个低劣但可行的方法 – 但记住要在这种情况下颠倒索引…:

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

事实上,这是一个主要的用例,当我们在讨论是否添加内置reversed(range(...并不是微不足道的获取而没有reversed ,并且有时以相反的顺序在列表中循环)有用的

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

真的很容易弄错;-)。

不过,我在这个答案开始时推荐的listcomp看起来越来越好,因为考虑了替代方法,不是吗?

 for el in L: if el == 2: del L[el]