Python: функция сортировки прерывается при наличии nan

sorted ([2, float ('nan'), 1]) возвращает [2, nan, 1]

(по крайней мере, в реализации Activestate Python 3.1).

Я понимаю, что nan - странный объект, поэтому я не удивлюсь если он появляется в случайных местах в результате сортировки. Но это также портит сортировку для чисел, отличных от nan, в контейнере, что действительно неожиданно.

Я задал связанный с вопрос о max , и на основании этого я понимаю, почему sort работает именно так. Но следует ли считать это ошибкой?

В документации просто сказано «Вернуть новый отсортированный список [...]» без указания каких-либо деталей.

РЕДАКТИРОВАТЬ: Теперь я согласен с тем, что это не является нарушением стандарта 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)

Я подозреваю, что это приводит к снижению производительности по сравнению с языком, который делает это по умолчанию, но, по крайней мере, он работает (за исключением любых обнаруженных мной ошибок).

29
задан Community 23 May 2017 в 12:09
поделиться