【问题标题】:Why doesn't .remove inside for loop remove all instances from list in Python? [duplicate]为什么 .remove inside for 循环不从 Python 列表中删除所有实例? [复制]
【发布时间】:2020-07-03 03:51:07
【问题描述】:

在输入我的问题的标题时,Stack Overflow 提供了一个指向该问题的链接,其标题确实与我的问题几乎完全匹配:

Calling `.remove()` inside `for` loop doesn't remove all elements

但是,这个问题是关于 jQuery 的,我以前从未听说过,而且示例代码似乎比我的要复杂得多。此外,对该问题的公认答案似乎是说代码多次扫描列表并在最后一次崩溃;我认为我的示例不是这种情况。

def f(x):
    for num in x:
        if num==np.NINF:
            x.remove(num)
    return x
print(f([0,np.NINF,np.NINF]))

这将返回 [0, -inf] 而不是预期的 [0]。为什么?

【问题讨论】:

  • 尝试修改您正在迭代的相同序列将会导致眼泪,无论您尝试使用哪种语言。
  • 一般来说,在迭代列表时修改列表是 python 中的禁忌(以及其他语言,你自己注意到了 javascript)。您可以通过多种方式处理此问题(反向遍历列表,使用空切片 [:]list 修复原始列表,收集索引,创建不包含不需要元素的新列表,...)
  • 尝试使用for num in x[:]:,这将复制原始列表。

标签: python list


【解决方案1】:

永远不要,我会一直重复,在你使用的for 循环中使用mutable 对象的remove 函数。如果你使用它会发生什么?让我演示一下。

只是说我想使用与您相同的方法删除列表中的所有值。

x=[1,2,3,4,5,6,7,8]

for i in x:
    x.remove(i)

print(x)

你认为输出会是什么?

正如预期的那样,它应该是一个空列表,对吧?

不!

上述程序打印以下输出。

[2, 4, 6, 8]

为什么会这样?

您正在调用可变对象的元素并同时删除它们,这会重置整个对象及其元素。

现在,我想你可以理解为什么你的程序返回错误的输出了。

您可以通过多种方式实现所需的输出。我会给你一种方法。

import numpy as np 

def f(x):
    output=[]
    for num in x:
        if num!=np.NINF:
            output.append(num)
    return output

print(f([0,np.NINF,np.NINF]))

上述函数的输出是根据需要的。

[0]

这应该适合你。

【讨论】:

  • 这是回答此常见常见问题解答的有效尝试,但您应该认识到,如果不是每天,每周都会多次询问此问题,并集中精力查看规范的现有答案(这问题现在被标记为重复)。此外,推荐初学者安装庞大的第三方库 NumPy 只是因为它恰好提供了一种方便的解决方法是非常可疑的。
  • @tripleee 你能再看看他的程序吗?他显然在使用 numpy,而且他一定已经安装了它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 2011-01-12
  • 2022-10-04
  • 2022-10-13
  • 2022-12-13
  • 2023-01-31
  • 2021-11-28
相关资源
最近更新 更多