考虑my_list包含的Python列表['foo', 'foo', 'bar'].
什么是最Python的方式uniquify和排序列表?
(想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()
Run Code Online (Sandbox Code Playgroud)
Ign*_*ams 93
my_list = sorted(set(my_list))
Run Code Online (Sandbox Code Playgroud)
tzo*_*zot 16
# 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)))
Run Code Online (Sandbox Code Playgroud)
快点:
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)))
Run Code Online (Sandbox Code Playgroud)
两个版本都返回一个生成器,因此您可能希望将结果提供给列表类型:
sequence= list(sort_uniq(sequence))
Run Code Online (Sandbox Code Playgroud)
请注意,这也适用于不可清洗的项目:
>>> list(sort_uniq([[0],[1],[0]]))
[[0], [1]]
Run Code Online (Sandbox Code Playgroud)
Ignacio-提供了直接的解决方案sorted(set(foo)).
如果您有独特的数据,那么您不仅可以做到这一点,sorted(set(...))而且还可以随时存储一组,并偶尔提取值的排序版本.(此时,它开始听起来像人们经常使用数据库的那种东西.)
如果您有一个排序列表,并且想要检查对数的成员资格并在最坏情况线性时间添加项目,则可以使用该bisect模块.
如果你想一直保持这种状态,你想简化一些事情或让一些操作表现得更好,你可以考虑blist.sortedset.