【问题标题】:What arguments does Python sort() function have?Python sort() 函数有哪些参数?
【发布时间】:2010-12-30 16:03:55
【问题描述】:

除了key还有其他参数吗,例如:value

【问题讨论】:

  • 好吧,它有效吗?它到底应该做什么。

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


【解决方案1】:

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 是首选,因为它们在much faster 上工作得比等价的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 参数中传递给sortsorted .

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

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

迷你基准,keycmp

出于好奇,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,数据是列表)?
  • 好吧,modNames 中位于 data 中的项目将按照它们在 data 中的方式进行排序 - 没有的项目将被分配键 0 并在列表的开头排序数据中的第一项也具有键 0。
  • 请注意,cmp 在 python3 中已弃用
【解决方案2】:

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

【讨论】:

  • 他只是把“价值”作为一个(这里不合适的)例子说,因为他看到“关键”和“价值”一起提到。
【解决方案3】:

是的,它需要其他参数,但没有 value

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

value 参数甚至意味着什么?

【讨论】:

  • help() 通常比直接打印__doc__ 更有用。
  • 我通常使用 ipython,可以写list.sort? 而不是help(list.sort) 来寻求帮助。
猜你喜欢
  • 2016-09-25
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
相关资源
最近更新 更多