除之外key,是否还有其他参数,例如:value?
key
value
sort和的参数sorted 双方sort并sorted有三个关键字参数:cmp,key和reverse。
sort
sorted
L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*; cmp(x, y) -> -1, 0, 1 sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list `` 最好使用key和reverse,因为它们比等效的要快得多cmp。 key应该是一个接受项目并返回值进行比较和排序的函数。reverse允许颠倒排序顺序。 使用key参数 您可以operator.itemgetter用作键参数,以按元组中的第二,第三等进行排序。 例
from operator import itemgetter a = range(5) b = a[::-1] c = map(lambda x: chr(((x+3)%5)+97), a) sequence = zip(a,b,c)
from operator import itemgetter
a = range(5) b = a[::-1] c = map(lambda x: chr(((x+3)%5)+97), a) sequence = zip(a,b,c)
sorted(sequence, key = itemgetter(0)) [(0, 4, ‘d’), (1, 3, ‘e’), (2, 2, ‘a’), (3, 1, ‘b’), (4, 0, ‘c’)]
sorted(sequence, key = itemgetter(1)) [(4, 0, ‘c’), (3, 1, ‘b’), (2, 2, ‘a’), (1, 3, ‘e’), (0, 4, ‘d’)]
sorted(sequence, key = itemgetter(2)) [(2, 2, ‘a’), (3, 1, ‘b’), (4, 0, ‘c’), (0, 4, ‘d’), (1, 3, ‘e’)]
说明 序列可以包含任何对象,甚至不具有可比性,但是如果我们可以定义一个函数,该函数可以为每个项目进行比较,则可以将该函数的key参数传递给sortor sorted。 itemgetter特别是创建一个从其操作数中获取给定项目的函数。文档中的示例: 之后,f=itemgetter(2)呼叫f(r)返回r[2]。 迷你基准,keyvscmp 出于好奇key和cmp性能的考虑,越小越好:
from timeit import Timer Timer(stmt=”sorted(xs,key=itemgetter(1))”,setup=”from operator import itemgetter;xs=range(100);xs=zip(xs,xs);”).timeit(300000) 6.7079150676727295 Timer(stmt=”sorted(xs,key=lambda x:x[1])”,setup=”xs=range(100);xs=zip(xs,xs);”).timeit(300000) 11.609490871429443 Timer(stmt=”sorted(xs,cmp=lambda a,b: cmp(a[1],b[1]))”,setup=”xs=range(100);xs=zip(xs,xs);”).timeit(300000) 22.335839986801147 ```
因此,排序的速度key似乎至少是的两倍cmp。使用itemgetter而不是lambda x: x[1]使排序更快。