Я пытаюсь отсортировать список и обойти плохую обработку Python nan
и inf
.
Мне нужно разбить список на все отсортированные (или перевернутые) числа и в конце списка любой NaN или Inf. Порядок нечисловых (NaN/Inf) элементов не важен, если они расположены в конце списка.
Например:
n = [13, 4, 52, 3.1, float('nan'), float('inf'), 8.2]
print(n)
o = sorted(n, key = lambda x : float('inf') if (x != x) else x)
print(o)
print(reversed(o))
o
работает и выводит:
[3.1, 4, 8.2, 13, 52, nan, inf]
Но использование выходов reversed
:
[inf, nan, 52, 13, 8.2, 4, 3.1]
Это не то, чего я хочу.
Я хочу, чтобы он обращал только те значения, которые не являются nan
и inf
.
Желаемый результат:
[52, 13, 8.2, 4, 3.1, nan, inf]
Используйте sorted
с math.isinf
и math.isnan
, чтобы определить, является ли это значение nan
или inf
. Если они являются реальными числовыми значениями, я отрицаю их для изменения их порядка.
Пример:
import math
n = [13, 4, 52, 3.1, float('nan'), float('inf'), 8.2]
lst = sorted(n, key=lambda x: (math.isinf(x) or math.isnan(x), -x))
print(lst)
Выход:
[52, 13, 8.2, 4, 3.1, nan, inf]
Если вы не хотите reverse
значения:
print(sorted(n))
Достаточно.
Выход:
[3.1, 4, 8.2, 13, 52, nan, inf]
Обратите внимание, что наивного sorted
недостаточно, если задействован nan
. Попробуйте sorted(n[::-1])
для быстрого примера; nan
«разделяет» список во время сортировки. Проблема в том, что sorted
считает число «выполненным», когда оно сравнивается с другим, как ожидалось, и, поскольку nan
не сравнивается, как ожидалось, это ломает вещи. Дает ли sorted
ожидаемый результат, зависит от исходной позиции nan
.
@MisterMiyagi Спасибо, я пояснил разделение.