在Python列表上进行排序加uniq的最简洁方法是什么?

kno*_*orv 55 python unique

考虑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)

  • 请注意,这仅适用于可散列类型,因此例如这不适用于列表. (18认同)
  • 排序后跟就地唯一性比将列表转换为集合然后对其进行排序要高效得多。即使使用最小堆也会更好。 (2认同)

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)


Mik*_*ham 5

Ignacio-提供了直接的解决方案sorted(set(foo)).

如果您有独特的数据,那么您不仅可以做到这一点,sorted(set(...))而且还可以随时存储一组,并偶尔提取值的排序版本.(此时,它开始听起来像人们经常使用数据库的那种东西.)

如果您有一个排序列表,并且想要检查对数的成员资格并在最坏情况线性时间添加项目,则可以使用该bisect模块.

如果你想一直保持这种状态,你想简化一些事情或让一些操作表现得更好,你可以考虑blist.sortedset.