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

16

除了 key,还有其他的参数吗?比如说: value


1
好的,它能工作吗?它具体应该做什么? - Ritwik Bose
3个回答

41

sort和sorted的参数

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函数运行得更快

key应该是一个接受项目并返回要比较和排序的值的函数。 reverse允许反向排序。

使用key参数

您可以使用operator.itemgetter作为key参数,以便按元组中第二个、第三个等项进行排序。

示例

>>> 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')]

解释

序列可以包含任何对象,甚至不可比较,但如果我们可以定义一个函数来产生每个项目可用于比较的内容,我们可以将此函数作为sortsorted中的key参数传递。

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] 可以使排序更快。


这段代码是如何工作的:modNames.sort(key=lambda a: (a in data) and data.index(a))(其中 modNames 和 data 都是列表)? - Mr_and_Mrs_D
modNames中与data相同的项目将按照它们在data中的顺序进行排序 - 不在其中的项目将被分配键0,并与具有键0的第一个数据项一起在列表开头排序。 - Mr_and_Mrs_D
需要注意的是,在Python3中cmp已被弃用。 - Mr_and_Mrs_D

3
除了key=之外,在Python 2.x中,列表的sort方法也可以使用cmp=参数(不是一个好主意,它已经在Python 3中被删除);你可以使用这两个参数中的任何一个或者都不使用,如果你想要让排序向下进行(而不是默认的向上),你可以始终传递reverse=True,如果你真的很想出于某种原因明确地请求向上排序,那么你也可以使用reverse=False。我不知道你提到的value参数应该做什么。

他只是举了一个(不合适的)例子,因为他曾经看到过“键”和“值”一起被提到。 - tzot

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


3
通常使用help()比直接打印__doc__更有用。 - Roger Pate
1
我通常使用ipython,这里可以只写list.sort?而不是help(list.sort)来获取帮助。 - sastanin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接