说出一个列表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))之间是否有任何区别?两者都导致具有相同值的可变对象。
我猜这个代码更快,因为在类型转换的情况下它只循环一次而不是两次?
答案 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]