除了键
,是否还有其他参数,例如:值
sort
和sorted
sort
和sorted
都有三个关键字参数:cmp
、key
和reverse
L.sort(cmp=None,key=None,reverse=False)——稳定排序*到位*;
化学机械抛光(x,y)——>-1, 0, 1
已排序(iterable,cmp=None,key=None,reverse=False)-->;新排序列表
最好使用键
和反转
,因为它们比等效的cmp
工作得快得多
key
应该是一个函数,它接受一个项并返回一个值进行比较和排序反向允许反向排序顺序
使用键
参数
您可以使用操作符.itemgetter
作为关键参数,在元组中按第二、第三等项进行排序
范例
>&燃气轮机&燃气轮机;从运算符导入itemgetter
&燃气轮机&燃气轮机&燃气轮机;a=范围(5)
&燃气轮机&燃气轮机&燃气轮机;b=a[:-1]
&燃气轮机&燃气轮机&燃气轮机;c=map(λx:chr((x+3)%5)+97),a)
&燃气轮机&燃气轮机&燃气轮机;顺序=zip(a、b、c)
#按元组中的第一项排序
&燃气轮机&燃气轮机&燃气轮机;已排序(序列,键=itemgetter(0))
[(0,4,'d'),(1,3,'e'),(2,2,'a'),(3,1,'b'),(4,0,'c')]
#按元组中的第二项排序
&燃气轮机&燃气轮机&燃气轮机;排序(序列,键=itemgetter(1))
[(4,0,'c'),(3,1,'b'),(2,2,'a'),(1,3,'e'),(0,4,'d')]
#按元组中的第三项排序
&燃气轮机&燃气轮机&燃气轮机;排序(序列,键=itemgetter(2))
[(2,2,'a'),(3,1,'b'),(4,0,'c'),(0,4,'d'),(1,3,'e')]
解释
序列可以包含任何对象,甚至是不可比较的对象,但是如果我们可以定义一个函数来生成我们可以对每个项进行比较的对象,那么我们可以在键
参数中将此函数传递给排序
或排序
itemgetter
,特别是创建这样一个函数,从其操作数中获取给定项。其文档中的一个示例:
在,
f=itemgetter(2)
之后,调用f(r)
返回r[2]
迷你基准,key
vscmp
出于好奇,key
和cmp
性能相比,越小越好:
>&燃气轮机&燃气轮机;从timeit导入计时器
&燃气轮机&燃气轮机&燃气轮机;计时器(stmt=“sorted(xs,key=itemgetter(1))”,setup=“from operator import itemgetter;xs=range(100);xs=zip(xs,xs);”)。timeit(300000)
6.7079150676727295
&燃气轮机&燃气轮机&燃气轮机;计时器(stmt=“sorted(xs,key=lambda x:x[1])”,setup=“xs=range(100);xs=zip(xs,xs);”)。timeit(300000)
11.609490871429443
&燃气轮机&燃气轮机&燃气轮机;计时器(stmt=“排序(xs,cmp=lambda,b:cmp(a[1],b[1])”),setup=“xs=range(100);xs=zip(xs,xs);”)。timeit(300000)
22.335839986801147
因此,使用键
排序的速度似乎至少是使用cmp
排序的两倍。使用itemgetter
而不是lambda x:x[1]
可以加快排序速度