5 个回答

8

Ignacio 提供了一个简单的解决方案——sorted(set(foo))

如果你有一些独特的数据,可能你不仅仅想用 sorted(set(...)),而是希望一直存储一个集合,并偶尔提取出这些值的排序版本。(这时候,听起来就像是人们常常会用数据库来处理的事情。)

如果你有一个已经排好序的列表,想要快速检查某个元素是否在里面,并且在最坏的情况下添加一个新元素的时间是线性的,你可以使用bisect模块

如果你想一直保持这种状态,并且希望简化操作或提高某些操作的效率,你可以考虑blist.sortedset

20
# 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)))

这两个版本都会返回一个生成器,所以你可能想把结果放到一个列表里:

sequence= list(sort_uniq(sequence))

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

>>> list(sort_uniq([[0],[1],[0]]))
[[0], [1]]
144
my_list = sorted(set(my_list))

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得简单易懂。

撰写回答