sorted([2, float('nan'), 1])
возвращает [2, nan, 1]
Python: функция сортировки брейки в присутствии нан
Я понимаю nan
это странный объект, так что я не удивлюсь, если (по крайней мере на ActiveState Python 3.1) реализации. он появляется в случайных местах в результате сортировки. Но это также испортило сортировку для не-наном чисел в контейнере, что действительно неожиданно.
Я спросил related question о max
, и на основании этого я понимаю, почему sort
работает следующим образом. Но следует ли это считать ошибкой?
Документация просто говорит: «Верните новый отсортированный список [...]» без указания каких-либо деталей.
EDIT: Я согласен с тем, что это не нарушает стандарт IEEE. Однако, я думаю, это ошибка с точки зрения здравого смысла. Даже Microsoft, которая, как известно, часто допускает свои ошибки, признала это ошибкой и исправила ее в последней версии: http://connect.microsoft.com/VisualStudio/feedback/details/363379/bug-in-list-double-sort-in-list-which-contains-double-nan.
Во всяком случае, я в конечном итоге следующий @ ответ Хачика:
sorted(list_, key = lambda x : float('-inf') if math.isnan(x) else x)
Я подозреваю, что это приводит к снижению производительности по сравнению с языком делать, что по умолчанию, но, по крайней мере, он работает (за исключением каких-либо ошибок, которые я представил).
Не номер (NAN) - это недопустимый ввод для численного сортировки или чего-либо ожидающего числа; поэтому я бы не стал считать это ошибкой. – frayser
@Frayser: это не совсем правильно. Это недействительно в Python? Нет, потому что Python не вызывает исключений. Это недействительно в IEEE754? Нет, потому что он обеспечивает очень специфическое поведение (по крайней мере, для тихого «нан»). Недействителен ли он в каком-либо другом стандарте? – max
Хотя понятно, что «нан» случайно окажется где-то в результирующем списке, что труднее понять, так это, по-видимому, правильное поведение, чтобы некорректно упорядочить числовые значения в последнем: sorted ([1.0, 2.0, 3.0, float ('nan'), 4.0, 3.0, 2.0, 1.0]) => [1.0, 2.0, 3.0, nan, 1.0, 2.0, 3.0, 4.0]. См. Http://bugs.python.org/issue12286. – Noah