尝试删除Python中的重复项时,只有一个项不会被删除。为什么?

Sur*_*nna 3 python

copyofnumbers = [1, 2, 3, 3, 1, 1, 4, 4, 5, 6, 7, 6, 7, 1]
copyofnumbers.sort()

for item in copyofnumbers:
    if (copyofnumbers.count(item) > 1):
        copyofnumbers.remove(item)

print(copyofnumbers)
Run Code Online (Sandbox Code Playgroud)

我正在尝试从列表中删除相同的项目。上面的代码删除所有重复的项目,但不删除“ 1”。我究竟做错了什么 ?

[1, 1, 2, 3, 4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)

我希望输出应删除所有重复的项目。

我希望代码删除所有重复的项目。

Wil*_*sem 5

您遍历要处理的列表。这意味着每次迭代都会“游标”进行,但是如果删除一个元素,则列表将因此减少,结果,跳数为2。

确实,请想象以下情况:

1 2 2 2 2 4 5
  ^
Run Code Online (Sandbox Code Playgroud)

此处的插入符号表示迭代器的光标。因此,您检查是否4多次发生。因此4,您删除了,Python显然会删除第一个。然后,开始下一个迭代,以使插入符前进。因此,下一次迭代的结果如下所示:

1 2 2 2 4 5
    ^
Run Code Online (Sandbox Code Playgroud)

因此,您“跳过”了2。也许这看起来还不成问题。既然我们仍然可以删除2。但是,如果我们以后删除next 2,情况将如下所示:

1 2 2 4 5
      ^
Run Code Online (Sandbox Code Playgroud)

因此,现在我们不再希望删除2

话虽这么说,使用.count(..).remove(..)通常不是一个好主意。A .count(..)需要花费线性时间来计算元素,而a .remove(..)(如果从左侧删除)也需要花费最坏情况的线性时间,从而使它成为二次算法。即使这样做有效,也不是很有效。

如果元素是可哈希的,并且整数是可哈希的,我们可以将它们简单地转换为set(然后转换list为,例如使用sorted),例如:

sorted(set(copyofnumbers))
Run Code Online (Sandbox Code Playgroud)

这给我们:

>>> sorted(set(copyofnumbers))
[1, 2, 3, 4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)