0

在python中,s的sort方法list接受一个key参数,它是一个函数。

我的问题是,返回值有什么限制key?它应该是一个数值吗?它应该以某种方式具有可比性吗?还是每种类型的价值都有效?

4

3 回答 3

1

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

文档:(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()

python3 的新特性

当操作数没有有意义的自然排序时,排序比较运算符 ( <, <=, >=, >) 会引发异常。因此,像, orTypeError这样的表达式不再有效,例如raises而不是返回 。一个推论是对异构列表进行排序不再有意义——所有元素必须相互可比。请注意,这不适用于and运算符:不同类型的对象总是比较不相等。1 < ''0 > Nonelen <= lenNone < NoneTypeErrorFalse==!=

于 2013-09-30T17:14:36.063 回答
1

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

在 Python 2 中,一切都可以与其他一切相提并论,这使得限制变得毫无意义。

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

请注意,这对key函数没有什么特别之处;相同的限制适用于被排序的值,请参阅比较文档。该key函数所做的只是让您提供一个“替代”值来排序,而不是给定位置的实际值。

于 2013-09-30T17:14:37.070 回答
0

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

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

于 2013-09-30T17:19:11.180 回答