Python List:这是在保留顺序的同时删除重复项的最佳方法吗? [复制]

Posted

技术标签:

【中文标题】Python List:这是在保留顺序的同时删除重复项的最佳方法吗? [复制]【英文标题】:Python List: Is this the best way to remove duplicates while preserving order? [duplicate] 【发布时间】:2011-08-29 15:26:51 【问题描述】:

可能的重复: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)]

【问题讨论】:

保持订单真的很重要吗?如果他们必须这样做,那么您的计算成本将会很高。如果您可以放弃订购,只需将物品放在一组中,然后再将其重新变成列表。 【参考方案1】:

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

【讨论】:

看起来不错(类似docs.python.org/library/itertools.html#recipes) 这太棒了。谢谢菲利克斯!!!【参考方案2】:
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]

【讨论】:

以上是关于Python List:这是在保留顺序的同时删除重复项的最佳方法吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中,从列表中删除重复项以使所有元素都是唯一的*同时保留顺序*的最快算法是啥? [复制]

Python中对列表list去重

Python中对列表list去重

Python中对列表list去重

Python中List的去重问题

C++ 删除存在于另一个向量中的向量项,同时保留顺序