2013-09-30 3 views
0

В python метод sortlist s принимает параметр key, который является функцией.Каким должен быть тип возвращаемого значения ключевой функции в sort()?

Мой вопрос в том, какие существуют ограничения на возвращаемое значение key? Должно ли это быть числовым значением? Должно ли это быть каким-то сопоставимым? Или каждый тип ценности просто работает?

ответ

1

Единственное ограничение состоит в том, что возвращаемые значения должны быть сопоставимы; они должны поддерживать <, >, <=, >= и == тестов.

В Python 2, все сопоставимо со всем остальным, что делает ограничение довольно спорным.

В Python 3 есть больше ограничений на то, что делает ценности сопоставимыми; например, сопоставления между объектами разных типов не поддерживаются, поэтому вы не хотите возвращать типы микса.

Обратите внимание, что это не что-то особенное для функции key; те же ограничения применяются к сортируемым значениям, см. Comparisons documentation. Все, что делает функция key, позволяет вам предоставить значение «stand-in» для сортировки вместо фактического значения в данной позиции.

+0

«Сравнение между объектами разных типов не поддерживается» -> Собственно, это не совсем так; встроенные типы не поддерживают его, но вполне возможно написать собственный класс, который знает, как это сделать. – kindall

+0

@kindall: Конечно, я упрощал ради читаемого ответа здесь. –

+0

Fairy nuff, spose! – kindall

1

В py2.x вы можете вернуть все, что захотите, но в py3.x вы получите ошибки, если возвращаете разные типы значений (объекты), потому что вы не можете сравнивать два разных типа объектов в py3.x

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:

Операторы сравнения упорядочение (<, <=, >=, >) г aise a TypeError Исключение, когда операнды не имеют значимого естественного порядка. Таким образом, выражения, такие как 1 < '', 0 > None или len <= len, уже не являются действительными и, например, действительными. None < None поднимает TypeError вместо возврата False. Следствием является то, что сортировка гетерогенного списка уже не имеет смысл - все элементы должны быть сопоставимы друг с другом. Примечание , что это не относится к операторам == и !=: объекты разные несравнимые типы всегда сравниваются неравномерно друг с другом.

0

Ключевая функция - это просто функция, которая применяется к каждому элементу перед сортировкой (см. https://wiki.python.org/moin/HowTo/Sorting/). На самом деле это не функция сравнения (я думаю, это то, что вы получаете).

Если вы сравниваете объекты по-своему, вам нужно будет определить набор «богатых сравнений» (я думаю, что это сообщение в блоге довольно неплохо обложено http://regebro.wordpress.com/2010/12/13/python-implementing-rich-comparison-the-correct-way/).

+0

Я знаю, что такое ключевая функция. Правильно прочитайте вопрос. – Pouria

Смежные вопросы