假设我有一个数字列表:
L = [1, 2, 3, 4, 5]
迭代时,如何从列表中删除元素(例如3)?
我尝试了以下代码,但没有成功:
for el in L:
if el == 3:
del el
有任何想法吗?
谢谢,博达·西多(Boda Cydo)。
最好的方法通常是建设性地进行-建立所需项目的新列表,而不要删除不需要的项目。例如:
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看起来越来越好了,不是吗?-)。
问题内容: Python如何在迭代时从列表中删除项目? 问题答案: 你可以使用列表推导来创建一个仅包含你不想删除的元素的新列表: 或者,通过分配给,你可以将现有列表突变为仅包含所需的项目: 如果还有其他引用somelist需要反映更改,则此方法可能很有用。 除了理解之外,你还可以使用itertools。在Python 2中: 或在Python 3中:
我有以下代码: 我试图遍历列表中的每个对象,根据条件删除一个项目,并保持循环,直到所有项目都被删除。 当我在intellij中运行这个时,我得到了以下错误: 我搜索了这个问题,找到了这个解决方案。在此处输入链接描述 当我更改代码时,它变成了: 但是,现在我收到以下错误: 我找到了这个错误的答案,但老实说,它并没有为我澄清任何事情。我如何才能从列表中删除该对象?
AFAIK,有两种方法: 迭代集合的副本 使用实际集合的迭代器 例如, 而且 有没有理由偏爱一种方法而不是另一种方法(例如,由于可读性的简单原因而偏爱第一种方法)?
问题内容: 当我运行此代码时,我将抛出ConcurrentModificationException。 当我从列表中删除指定的元素时,列表似乎不知道其大小已更改。 我想知道这是否是集合和删除元素的常见问题? 问题答案: 我相信这是Iterator.remove()方法背后的目的,是能够在迭代时从集合中删除一个元素。 例如:
问题内容: 我已经看过这篇文章: Python:通过删除每个第n个元素从现有列表构建新列表,但是由于某些原因,它对我不起作用: 我这样尝试: 此函数需要一个列表和。然后,它使用列表中的n步删除第n个元素,并打印结果。 这是我的函数调用: 错误的输出: 代替 然后我从上面的链接尝试了一个变体: 再次,函数调用: 给了我同样的错误的结果: 不是 如何正确地从列表中删除/删除/删除 第n个 项目? 问题
问题内容: 我正在尝试从这样的迭代中删除一些元素: 当然,当我尝试同时从列表中删除项目时,我会得到一个提示。有解决此问题的简单方法吗? 问题答案: 使用和致电: