在Python列表上进行sorting和uniq的最干净的方法是什么?

考虑一个包含['foo', 'foo', 'bar']的Python列表my_list

什么是Pythonic最独特的方式来整理和整理清单?
(想想cat my_list | sort | uniq

这是我目前的做法,虽然它的工作,我相信有更好的方法来做到这一点。

 my_list = [] ... my_list.append("foo") my_list.append("foo") my_list.append("bar") ... my_list = set(my_list) my_list = list(my_list) my_list.sort() 
 my_list = sorted(set(my_list)) 
 # Python ≥ 2.4 # because of (generator expression) and itertools.groupby, sorted import itertools def sort_uniq(sequence): return (x[0] for x in itertools.groupby(sorted(sequence))) 

更快:

 import itertools, operator import sys if sys.hexversion < 0x03000000: mapper= itertools.imap # 2.4 ≤ Python < 3 else: mapper= map # Python ≥ 3 def sort_uniq(sequence): return mapper( operator.itemgetter(0), itertools.groupby(sorted(sequence))) 

两个版本都会返回一个生成器,所以您可能想要将结果提供给列表types:

 sequence= list(sort_uniq(sequence)) 

请注意,这也适用于不可哈希的项目:

 >>> list(sort_uniq([[0],[1],[0]])) [[0], [1]] 

简单的解决scheme由Ignacio- sorted(set(foo))

如果您有独特的数据,那么您不仅希望进行sorted(set(...))而且还要随时存储一个集合,并偶尔提取这些值的sorting版本。 (在这一点上,听起来就像人们经常使用数据库的东西一样。)

如果你有一个sorting列表,你想检查对数的成员,并在最坏的情况bisect性时间添加一个项目,你可以使用bisect模块 。

如果你总想保持这种状态,并且想要简化某些操作或者使某些操作更好地执行,那么可以考虑blist.sortedset

其他人提到了sorting(set(my_list)),它适用于可排列的值,如string,数字和元组,但不适用于不可清除的types,如列表。

要获取任何可sortingtypes的值的sorting列表,请不要重复:

 from itertools import izip, islice def unique_sorted(values): "Return a sorted list of the given values, without duplicates." values = sorted(values) if not values: return [] consecutive_pairs = izip(values, islice(values, 1, len(values))) result = [a for (a, b) in consecutive_pairs if a != b] result.append(values[-1]) return result 

这可以使用itertools文档中的 “pairwise”或“unique_justseen”配方进一步简化。

不能说这是干净的方式来做到这一点,但只是为了好玩:

 my_list = [x for x in sorted(my_list) if not x in locals()["_[1]"]]