Python 列表:这是去重并保留顺序的最佳方法吗?

2 投票
2 回答
2266 浏览
提问于 2025-04-17 00:32

可能的重复问题:
如何在Python中去除列表中的重复项,同时保持顺序?
算法 - 如何高效地删除列表中的重复元素?

我看过很多方法,都是关于如何在Python列表中去掉重复项,同时保持原来的顺序。所有的方法似乎都需要创建一个函数或子程序,我觉得这样不太高效。
我想出了以下方法,想知道这是否是最有效的去重方式?
(因为我需要快速响应,所以这个方法必须尽可能高效。)谢谢!

b=[x for i,x in enumerate(a) if i==a.index(x)]

2 个回答

1

在编程中,有时候我们会遇到一些问题,像是代码运行不正常或者出现错误。这些问题可能是因为我们写的代码有bug,或者是使用的工具和环境不兼容。

当我们在网上寻找解决方案时,StackOverflow是一个很好的地方。这里有很多程序员分享他们的经验和解决方案。如果你在某个地方卡住了,可以在这个网站上搜索相关的问题,看看别人是怎么解决的。

不过,有时候你看到的答案可能会比较复杂,特别是对于刚开始学习编程的人来说。这个时候,理解这些技术内容就显得很重要。我们需要把复杂的概念用简单的语言解释清楚,这样大家才能更容易地理解和应用。

总之,遇到问题不要慌,善用网络资源,慢慢学习和积累经验,你会越来越熟练的!

lst = [1, 3, 45, 8, 8, 8, 9, 10, 1, 2, 3]
dummySet = set()
[(i, dummySet.add(i))[0] for i in lst if i not in dummySet]
6

a.index(x) 这个操作本身的时间复杂度是 O(n),因为需要在列表中查找值 x。所以整体的运行时间是 O(n^2)

“节省”函数调用并不能让一个糟糕的算法比一个好的算法更快。

更高效的方式(O(n))可能是:

result = []
seen = set()
for i in a:
    if i not in seen:
        result.append(i)
        seen.add(i)

你可以看看这个问题: 如何在保留顺序的情况下从列表中删除重复项?

(最上面的答案还展示了如何用列表推导的方式来实现,这比显式的循环更高效)


你可以使用 timeit [docs] 模块轻松地对你的代码进行性能分析。例如,我把你的代码放在 func1,我的代码放在 func2。如果我用一个包含 1000 个元素(没有重复项)的数组重复这个操作 1000 次:

>>> a = range(1000)
>>> timeit.timeit('func1(a)', 'from __main__ import func1, a', number=1000)
11.691882133483887
>>> timeit.timeit('func2(a)', 'from __main__ import func2, a', number=1000)
0.3130321502685547

现在有重复项了(只有 100 个不同的值):

>>> a = [random.randint(0, 99) for _ in range(1000)]
>>> timeit.timeit('func1(a)', 'from __main__ import func1, a', number=1000)
2.5020430088043213
>>> timeit.timeit('func2(a)', 'from __main__ import func2, a', number=1000)
0.08332705497741699

撰写回答