sorted([2, float('nan'), 1])
возвращает [2, nan, 1]
(По крайней мере, в реализации Activestate Python 3.1.)
Я понимаю, nan
- странный объект, поэтому я не удивлюсь, еслиэто появляется в случайных местах в результате сортировки.Но это также портит сортировку номеров non-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)
Я подозреваю, что это приводит к снижению производительности по сравнению с языком, который делает это по умолчанию, но, по крайней мере, это работает (исключая любые ошибки, которые я представил).