Python sort()函数有哪些参数?

时间:2009-12-29 02:49:35

标签: python python-3.x sorting key python-2.x

key之外是否还有其他参数,例如:value

3 个答案:

答案 0 :(得分:35)

sortsorted

的参数

sortsorted都有三个关键字参数:cmpkeyreverse

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

首选使用keyreverse,因为它们比同等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参数中的这个函数传递给sortsorted

特别是

itemgetter创建了一个从其操作数中获取给定项的函数。其文档中的一个例子:

  

f=itemgetter(2)之后,通话f(r)会返回r[2]

迷你基准,key vs cmp

出于好奇,keycmp性能比较,越小越好:

>>> 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论证甚至意味着什么?