在Python列表中,如何以最简洁的方式实现排序和去重?
考虑一个Python列表 my_list
,里面的内容是 ['foo', 'foo', 'bar']
。
那么,最符合Python风格的方式来 去重并排序 这个列表是什么呢?
(可以想象成 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()
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))
当然可以!请把你想要翻译的内容发给我,我会帮你把它变得简单易懂。