sort()中键函数的返回值的类型应该是什么?

时间:2013-09-30 17:13:17

标签: python python-2.7

在python中,sort的{​​{1}}方法接受list参数,这是一个函数。

我的问题是,key的返回值有哪些限制?它应该是一个数值吗?它应该具有可比性吗?或者每种类型的价值都有用吗?

3 个答案:

答案 0 :(得分:1)

在py2.x中你可以返回任何你想要的东西,但是在py3.x中如果你返回不同类型的值(对象)你会得到错误,因为你无法在py3.x中比较两种不同类型的对象< / p>

Docs:(py2.x):

  

运营商<>==>=<=!=比较两个值   对象。对象不必具有相同的类型。如果两者都是数字,   它们被转换为普通类型。否则,对象不同   类型总是比较不相等,并且一致地排序但是   任意。

     

将来,不同类型对象的比较规则是   可能会改变。

Py2.x:

>>> x = [1, '2', [3]]
>>> x.sort()
>>> x
[1, [3], '2']

Py3.x:

>>> x = [1, '2', [3]]
>>> x.sort()
Traceback (most recent call last):
    x.sort()
TypeError: unorderable types: str() < int()

What's new in python3

  

排序比较运算符(<<=>=>)引发TypeError   当操作数没有有意义的自然顺序时的异常。   因此,1 < ''0 > Nonelen <= len等表达式不再存在   有效,例如None < None提出TypeError而不是返回   False。一个必然结果是不再对异构列表进行排序   有道理 - 所有元素必须相互比较。注意   这不适用于==!=运算符:。的对象   不同的无与伦比的类型总是比较不相等。

答案 1 :(得分:1)

唯一的约束集是返回值应具有可比性;他们应该支持<><=>===测试。

在Python 2中,所有内容与其他所有内容都具有可比性,这使得限制变得没有实际意义。

在Python 3中,对值的可比性有更多限制;例如,不支持不同类型的对象之间的比较,因此您不希望返回混合类型。

请注意,这对key函数来说并不特别;相同的限制适用于要排序的值,请参阅Comparisons documentationkey函数所做的就是让你提供一个'替身'值来排序而不是给定位置的实际值。

答案 2 :(得分:0)

关键功能只是一个在排序之前应用于每个元素的函数(参见https://wiki.python.org/moin/HowTo/Sorting/)。它实际上不是一个比较函数(我认为这就是你所得到的)。

如果你是以某种自定义方式比较对象,你会想要定义一组“丰富的比较”(我认为这篇博文很好地涵盖了它http://regebro.wordpress.com/2010/12/13/python-implementing-rich-comparison-the-correct-way/)。