除了有其他论点 key, , 例如: value?

有帮助吗?

解决方案

参数 sortsorted

两个都 sortsorted 有三个关键字参数: cmp, keyreverse.

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 作为元组中的第三个项目排序的关键参数。

例子

>>> 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

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

其他提示

除了 key=, , 这 sort Python 2.x中的列表方法可以选择 cmp= 争论 (不是 一个好主意,已在Python 3中删除。在这两个中的任何一个或没有的情况下,您总是可以通过 reverse=True 要使排序向下移动(而不是按默认值向上,您也可以明确要求 reverse=False 如果您真的很想出于某种原因这样做)。我不知道那是什么 value 您要提到的论点应该做。

是的,它需要其他论点,但没有 value.

>>> print list.sort.__doc__
L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
cmp(x, y) -> -1, 0, 1

什么会 value 争论甚至意味着?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top