我想编写一个无循环程序(可能使用理解)来删除Python中排序数组中的重复元素(也是最有效的)。
答案 0 :(得分:5)
我个人只是用它。
>>> testList = [1, 1, 1, 2, 3, 3, 4, 4, 5, 6, 7, 8, 8, 9]
>>> sorted(set(testList))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
您甚至可以从头开始对列表进行排序。
>>> from random import shuffle
>>> shuffle(testList)
>>> testList
[1, 4, 5, 6, 2, 1, 3, 3, 4, 9, 8, 1, 7, 8]
>>> sorted(set(testList))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
答案 1 :(得分:4)
由于列表已排序 - 意味着所有重复项已经分组,您可以使用itertools.groupby
>>> testList = [1, 1, 1, 2, 3, 3, 4, 4, 5, 6, 7, 8, 8, 9]
>>> from itertools import groupby
>>> [k for k, g in groupby(testList)]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
转换为集合和排序更有效(在内存和时间上)。它还具有仅需要比较相等性的优点,因此也适用于不可用的项目。
答案 2 :(得分:1)
要利用现有订单,您需要使用itertools.groupby
。如果没有key
参数,itertools.groupby
组在参数iterable中运行相等的元素:
import itertools
newlist = [key for key, group in itertools.groupby(oldlist)]
这在O(n)中运行,而sorted(set(oldlist))
在O(nlog(n))中运行。
答案 3 :(得分:1)
根据article,在不保留订单的情况下统一列表的最快方法是:
def f9(seq):
# Not order preserving
return {}.fromkeys(seq).keys()
您可以在此处查看基准脚本:http://www.peterbe.com/plog/uniqifiers-benchmark/uniqifiers_benchmark.py
答案 4 :(得分:0)
使用numpy
testList = [1, 1, 1, 2, 3, 3, 4, 4, 5, 6, 7, 8, 8, 9]
import numpy
print numpy.unique(testList)