除key
之外是否还有其他参数,例如:value
?
答案 0 :(得分:35)
sort
和sorted
sort
和sorted
都有三个关键字参数:cmp
,key
和reverse
。
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
更有效。{/ p>
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)
# sort by first item in a tuple
>>> sorted(sequence, key = itemgetter(0))
[(0, 4, 'd'), (1, 3, 'e'), (2, 2, 'a'), (3, 1, 'b'), (4, 0, 'c')]
# sort by second item in a tuple
>>> sorted(sequence, key = itemgetter(1))
[(4, 0, 'c'), (3, 1, 'b'), (2, 2, 'a'), (1, 3, 'e'), (0, 4, 'd')]
# sort by third item in a tuple
>>> sorted(sequence, key = itemgetter(2))
[(2, 2, 'a'), (3, 1, 'b'), (4, 0, 'c'), (0, 4, 'd'), (1, 3, 'e')]
序列可以包含任何对象,甚至不具有可比性,但是如果我们可以定义一个函数来生成我们可以比较每个项的东西,我们可以将key
参数中的这个函数传递给sort
或sorted
。
itemgetter
创建了一个从其操作数中获取给定项的函数。其文档中的一个例子:
在
f=itemgetter(2)
之后,通话f(r)
会返回r[2]
。
key
vs cmp
出于好奇,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]
可以更快地排序。
答案 1 :(得分:3)
除了key=
之外,Python 2.x中的sort
列表方法也可以采用cmp=
参数(不一个好主意,它已被删除在Python 3);如果您确实是reverse=True
,那么您可以随时通过reverse=False
以使排序向下(而不是默认情况下向上),如果您真的是value
,也可以明确请求{{1}}因某种原因渴望这样做)。我不知道你提到的{{1}}论证应该做什么。
答案 2 :(得分:1)
是的,它需要其他参数,但没有value
。
>>> print list.sort.__doc__
L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
cmp(x, y) -> -1, 0, 1
value
论证甚至意味着什么?