最好的做法通常是建设性地进行——建立你想要的项目的新列表,而不是删除你不想要的项目。例如:
L[:] = [el for el in L if el != 3]
列表解析构建所需的列表并分配给“整个列表切片”L[:],确保您不只是重新绑定名称,而是完全替换 内容,因此效果与您想要执行的“删除”完全相同。这也很快。
如果您绝对不惜一切代价必须进行删除,那么一种微妙的方法可能会奏效:
>>> 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 在检查替代方案时看起来越来越好,不是吗?-)。