我想编写一个无循环程序(可能使用理解)来删除 Python 中排序数组中的重复元素(也是最有效的)。
问问题
187 次
5 回答
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]
于 2013-07-22T04:25:19.263 回答
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]
这比转换为集合和排序更有效(在内存和时间上)。它还具有只需要比较相等性的优点,因此也适用于不可散列的项目。
于 2013-07-22T04:33:00.197 回答
1
要利用现有订单,您需要使用itertools.groupby
. 在没有key
参数的情况下,itertools.groupby
groups 在参数 iterable 中运行相等的元素:
import itertools
newlist = [key for key, group in itertools.groupby(oldlist)]
这在 O(n) 中sorted(set(oldlist))
运行,而在 O(nlog(n)) 中运行。
于 2013-07-22T04:29:45.180 回答
1
根据这篇文章,在不保留顺序的情况下统一列表的最快方法是:
def f9(seq):
# Not order preserving
return {}.fromkeys(seq).keys()
您可以在此处查看基准脚本:http ://www.peterbe.com/plog/uniqifiers-benchmark/uniqifiers_benchmark.py
于 2013-07-22T04:55:13.950 回答
0
使用numpy
testList = [1, 1, 1, 2, 3, 3, 4, 4, 5, 6, 7, 8, 8, 9]
import numpy
print numpy.unique(testList)
于 2013-07-22T06:00:54.763 回答