当前位置: 首页 > 面试题库 >

在Python中迭代时如何从列表中删除元素?

公西季
2023-03-14
问题内容

假设我有一个数字列表:

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个 项目? 问题

  • 问题内容: 我正在尝试从这样的迭代中删除一些元素: 当然,当我尝试同时从列表中删除项目时,我会得到一个提示。有解决此问题的简单方法吗? 问题答案: 使用和致电: