在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]"]]