16

除了 之外还有其他论点key,例如:value

4

3 回答 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

使用keyandreverse是首选,因为它们的工作速度比等效的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)

# 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参数传递给sortor sorted

itemgetter,特别是创建这样一个从其操作数中获取给定项目的函数。其文档中的一个示例:

之后,f=itemgetter(2)调用f(r)返回r[2]

迷你基准,keyvscmp

只是出于好奇,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]使排序更快。

于 2009-12-29T09:17:36.400 回答
3

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

于 2009-12-29T02:55:20.927 回答
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争论甚至意味着什么?

于 2009-12-29T02:54:29.897 回答