无循环程序,用于删除已排序数组中的重复元素

时间:2013-07-22 04:23:16

标签: python

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

5 个答案:

答案 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)