sorted([2, float('nan'), 1])
возвращает [2, nan, 1]
(по крайней мере, для реализации Activestate Python 3.1.)
Я понимаю, что nan
- это странный объект, поэтому я не удивлюсь, если он появится в случайных местах в результате сортировки. Но это также испортило сортировку для не-наном чисел в контейнере, что действительно неожиданно.
Я спросил вопрос о max
, и на основании этого я понимаю, почему sort
работает так. Но следует ли это считать ошибкой?
Документация просто говорит: "Верните новый отсортированный список [...]" без указания каких-либо деталей.
EDIT: Теперь я согласен, что это не нарушает стандарт IEEE. Тем не менее, я думаю, это ошибка с любой точки зрения здравого смысла. Даже Microsoft, которая нередко признает свои ошибки часто, признала это ошибкой и исправила ее в последней версии: http://connect.microsoft.com/VisualStudio/feedback/details/363379/bug-in-list-double-sort-in-list-which-contains-double-nan.
В любом случае, я получил ответ @khachik:
sorted(list_, key = lambda x : float('-inf') if math.isnan(x) else x)
Я подозреваю, что это приводит к хиту производительности по сравнению с языком, который делает это по умолчанию, но по крайней мере он работает (запрет любых ошибок, которые я представил).