如何在Python中遍历列表时删除元素?
给定一个数字列表:
L = [1, 2, 3, 4, 5]
我在遍历这个列表的时候,怎么才能删除一个元素,比如说3?
我试过下面的代码,但没有成功:
for el in L:
if el == 3:
del el
2 个回答
在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。比如说,当你在写代码时,可能会发现某个功能没有按照预期工作。这时候,你可能会去网上查找解决办法,比如在StackOverflow这个网站上。
StackOverflow是一个程序员交流问题和解决方案的平台。在这里,很多人会把他们遇到的问题发出来,其他人则会提供帮助和建议。你可以看到很多不同的回答,有的可能很复杂,有的则比较简单易懂。
如果你在这个网站上看到了一些代码块,比如
for el in L:
if el == 2:
del L[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(range(...
在没有reversed
的情况下是很难获得的,而反向遍历列表有时也很有用。另一种方法
for i in range(len(L) - 1, -1, -1):
真的很容易出错;-)。
不过,我在这个回答开头推荐的列表推导式,随着我们对其他方法的考察,看起来越来越好,是吧?-)。