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

时间:2011-08-29 15:26:51

标签: python list duplicates

  

可能重复:
  How do you remove duplicates from a list in Python whilst preserving order?
  Algorithm - How to delete duplicate elements in a list efficiently?

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

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

2 个答案:

答案 0 :(得分: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?

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


您可以使用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

答案 1 :(得分: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]