1

我想编写一个无循环程序(可能使用理解)来删除 Python 中排序数组中的重复元素(也是最有效的)。

4

5 回答 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.groupbygroups 在参数 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 回答