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)
我希望输出应删除所有重复的项目。
我希望代码删除所有重复的项目。
您遍历要处理的列表。这意味着每次迭代都会“游标”进行,但是如果删除一个元素,则列表将因此减少,结果,跳数为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)
归档时间: |
|
查看次数: |
47 次 |
最近记录: |