从列表中获得唯一值的一个有趣的代码

问题描述:

说给出一个列表s = [2,2,2,3,3,3,4,4,4]从列表中获得唯一值的一个有趣的代码

我看到下面的代码被用于从s获得独特的价值观:

unique_s = sorted(unique(s)) 

,独特的定义为:

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

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

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

+0

使用代码按钮的邮政编码 – nkint 2012-01-27 15:05:24

+3

我相信上面的代码是用于(支持)2.3以前的python版本,当时set()还不存在。 – mouad 2012-01-27 15:08:24

+0

不是一个python家伙,所以不会发布这个答案,但它看起来像他们做同样的事情,除了做列表(集合)可能不保证顺序,而当你打电话unique_s = sorted(unique(s))它似乎维护顺序 – NominSim 2012-01-27 15:09:03

你应该用你所描述的代码:

list(set(s)) 

这适用于所有的蟒蛇从2.4(我认为)至3.3,简洁,并采用内置插件在一个易于理解的方式。

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

对于排序序列可以使用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]