如何在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]
- find与pip安装哪个版本的软件包
- 我如何将Python的date时间对象转换为UTC?
- 用追踪loggingexception
- Django – render(),render_to_response()和direct_to_template()之间有什么区别?
- Selenium:FirefoxProfileexception无法加载configuration文件
- 我可以将Python Windows软件包安装到virtualenvs中吗?
- Django 1.8和syncdb / migrate引发的auth_user错误
- 如何使用Python / Django执行HTML解码/编码?
- pandas+数据框 – select部分string