关于python:从类似的,不可用的项目列表中删除重复项的最快方法

Fastest way to remove duplicates from a list of comparable, unhashable items

本问题已经有最佳答案,请猛点这里访问。

如果我只知道列表元素可以排序,那么如何从列表中删除重复项?(我也不关心列表中项目的顺序。)

现有的问题,比如如何从python列表中删除重复项并保持顺序?或者,删除列表中的重复项需要使用集合,即要求列表中的项是可哈希的。在我的例子中,哈希性并不能保证。


在Python中,对已经排序的列表进行排序的调用的开销可以忽略不计。增加额外的复杂性和有人意外地将错误的参数传递给函数的可能性是不值得的。

1
2
3
4
5
6
7
from itertools import groupby
def remove_duplicates(data):
    ''' Remove duplicates from the data (normally a list).
        The data must be sortable and have an equality operator
    '''

    data = sorted(data)
    return [k for k, v in groupby(data)]


编辑:请看约翰·拉罗伊的回答。

同样,这个解决方案只适用于可排序的列表。如果预先对其排序(实际上只需要对对象进行分组),可以将sort设置为false,然后只需要比较运算符。

1
2
3
4
5
6
7
8
9
10
11
12
13
def remove_duplicates(data, sort=True):
    ''' Remove duplicates from the data (normally a list).
        The data must be sortable and have an equality operator
    '''

    if not data:
        return data
    if sort:
        data = sorted(data)
    out = [data[0]]
    for i, n in enumerate(data[1:]):
        if data[i] != n:
            out.append(n)
    return out