最好的做法通常是建设性地进行——建立你想要的新项目列表,而不是删除那些你不需要的项目。例如。:
L[:] = [el for el in L if el != 3]
列表理解构建所需的列表并分配给“整个列表切片”,L[:]
,确保你是not只是重新绑定一个名称,但完全替换contents,因此效果与您想要执行的“删除”完全相同。这也很快。
如果你绝对,不惜一切代价,must相反,进行删除,一种微妙的方法可能会起作用:
>>> ndel = 0
>>> for i, el in enumerate(list(L)):
... if el==3:
... del L[i-ndel]
... ndel += 1
没有哪个地方像 listcomp 方法那样优雅、干净、简单或性能良好,但它确实完成了这项工作(尽管乍一看它的正确性并不明显,事实上我在编辑之前就错了!-)。 “不惜一切代价”此处适用;-)。
对于“必须删除”的情况,用索引循环代替项目是另一种较差但可行的方法 - 但请记住reverse在这种情况下的索引...:
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 看起来越来越好,因为检查了替代方案,不是吗?-)。