一个有趣的代码,用于从列表中获取唯一值

时间:2012-01-27 15:04:01

标签: python

说出一个列表s = [2,2,2,3,3,3,4,4,4]

我看到以下代码用于从s:

获取唯一值
unique_s = sorted(unique(s))

其中unique定义为:

def unique(seq): 
    # not order preserving 
    set = {}
    map(set.__setitem__, seq, []) 
    return set.keys()

我只是想知道这个和刚做列表(set(s))之间是否有任何区别?两者都导致具有相同值的可变对象。

我猜这个代码更快,因为在类型转换的情况下它只循环一次而不是两次?

2 个答案:

答案 0 :(得分:3)

您应该使用您描述的代码:

list(set(s))

这适用于从2.4(我认为)到3.3的所有Pythons,简洁,并以易于理解的方式使用内置函数。

如果unique不是内置函数,函数set似乎可以工作,对于Python 2.3来说也是如此。 Python 2.3相当古老(2003)。对于Python 3.x系列,unique函数也被破坏,因为dict.keys返回Python 3.x的迭代器。

答案 1 :(得分:1)

对于排序序列,您可以使用itertools unique_justseen() recipe获取唯一值,同时保留顺序:

from itertools import groupby
from operator import itemgetter

print map(itemgetter(0), groupby([2,2,2,3,3,3,4,4,4]))
# -> [2, 3, 4]

要从已排序的序列中删除重复项(仅保留唯一值):

def del_dups(sorted_seq):
    prev = object()
    pos = 0
    for item in sorted_seq:
        if item != prev:
            prev = item
            sorted_seq[pos] = item
            pos += 1
    del sorted_seq[pos:]

L = [2,2,2,3,3,3,4,4,4]
del_dups(L)
print L # -> [2, 3, 4]