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