给定一个数字列表:
L = [1, 2, 3, 4, 5]
在迭代列表时,如何删除一个元素(比如3)?
我尝试了以下代码,但没有成功:
for el in L:
if el == 3:
del el
给定一个数字列表:
L = [1, 2, 3, 4, 5]
在迭代列表时,如何删除一个元素(比如3)?
我尝试了以下代码,但没有成功:
for el in L:
if el == 3:
del el
通常最好采取建设性的方式--构建您想要的新项目清单,而不是删除您不需要的项目。例如:
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
使用循环语句而不是列表推导式的代码不如优雅、简洁、简单或高效,但它确实完成了任务(虽然其正确性不容易一眼看出,事实上,在编辑之前我就弄错了!),“不惜一切代价”适用于此;-)。
对于“必须执行删除”的情况,按索引循环而不是按项循环是另一种较差但可行的方法——但请记住在这种情况下要反转索引...:
for i in reversed(range(len(L))):
if L[i] == 3: del L[i]
实际上,当我们在辩论是否添加内置函数 reversed
时,这是其主要使用案例之一 -- 没有 reversed
,获取 reversed(range(...
并不容易,而倒序遍历列表有时很有用。替代方法是
for i in range(len(L) - 1, -1, -1):
很容易出现错误,哈哈;-)。
不过,随着其他替代方案的考虑,我在这个答案开头推荐的列表解析看起来越来越好了,是吧?-)
reversed(enumerate(...
不起作用——enumerate
是一个可迭代对象而不是序列,reversed
需要一个序列作为其参数)。 - Alex Martellifor el in L:
if el == 2:
del L[el]
2
,则删除L的“第三个项目”(可能不止一次),并且在执行此类删除时经常跳过L中的一个项目。真是个噩梦调试...!-) - Alex Martelli
L.remove(3)
或列表推导式。但是这个问题并不能涵盖所有更一般的情况,比如“从排序列表中删除重复相邻的值”。 - smci