2011-08-29 64 views
2

可能重复:
How do you remove duplicates from a list in Python whilst preserving order?
Algorithm - How to delete duplicate elements in a list efficiently?Python列表:这是在保留顺序的同时删除重复项的最佳方法吗?

我已经读了很多的方法,从一个Python列表中删除重复项,同时保持秩序。所有的方法似乎都需要创建一个函数/子程序,我认为这在计算上不是很有效。 我想出了以下内容,我想知道这是否是计算效率最高的方法? (我对这种用法必须是最有效的可能的,因为需要有快速的响应时间。)谢谢

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

如果他们留,真的很要紧有序?如果他们不得不,那么你的计算成本会很高。如果您可以放弃订购,只需将物品放入一个集合中,然后将其放回列表中。 –

回答

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) 

看一看这个问题:How do you remove duplicates from a list in whilst preserving order?

(顶端回答还说明了如何在一个列表理解的方式,这样做哪些将比明确的循环更有效)


你可以很容易地profil使用timeit[docs]模块自己编写代码。例如,我把你的代码放在func1和我的func2中。如果我有一个数组重复这个10001000元素(无重复):

>>> 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 
+0

看起来不错(类似于http://docs.python.org/library/itertools.html#recipes) – phimuemue

+0

这太棒了。谢谢菲利克斯! – user918081

+0

@user:欢迎:) –

1
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] 
相关问题