Python列表:这是在保留顺序的同时删除重复项的最佳方法吗?

Python列表:这是在保留顺序的同时删除重复项的最佳方法吗?,python,list,duplicates,Python,List,Duplicates,可能的重复项: 我读过很多方法,这些方法可以在保留顺序的同时从python列表中删除重复项。所有的方法似乎都需要创建一个函数/子程序,我认为这在计算效率上不是很高。 我提出了以下建议,我想知道这是否是计算效率最高的方法? (由于需要快速响应时间,我必须尽可能高效地使用此功能。)谢谢 a.index(x)本身将是O(n),因为必须在列表中搜索值x。整个运行时是O(n^2) “保存”函数调用不会使坏算法比好算法快 更有效的(O(n))可能是: result = [] seen = set() f

可能的重复项:

我读过很多方法,这些方法可以在保留顺序的同时从python列表中删除重复项。所有的方法似乎都需要创建一个函数/子程序,我认为这在计算效率上不是很高。 我提出了以下建议,我想知道这是否是计算效率最高的方法? (由于需要快速响应时间,我必须尽可能高效地使用此功能。)谢谢

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)
看看这个问题:

(最上面的答案还显示了如何以列表理解的方式执行此操作,这将比显式循环更有效)


您可以使用该模块轻松地分析自己的代码。例如,我将您的代码放在
func1
中,将我的代码放在
func2
中。如果我对包含
1000
元素的数组重复此
1000
次(无重复):

现在使用重复项(仅100个不同的值):


他们保持秩序真的重要吗?如果他们不得不这样做,你的计算成本将会很高。如果你可以放弃订购,只需将物品放在一个集合中,然后再将其放回一个列表中即可。这看起来不错(类似于在上所看到的),这太棒了。谢谢菲利克斯!!!
result = []
seen = set()
for i in a:
    if i not in seen:
        result.append(i)
        seen.add(i)
>>> 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
>>> 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
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]