Как вы проверяете nan в python jmespath?

Предположим import jmespath. Допустим, у меня есть некоторые данные, например:

In [3]: data=[{'foo':10}, {'foo':float('nan')}, {'foo':32}]

In [4]: data
Out[4]: [{'foo': 10}, {'foo': nan}, {'foo': 32}]

Я хочу использовать jmespath для подсчета количества узлов, которые являются nan. Кажется, я не могу понять. Я могу подсчитать узлы, отличные от nan, следующим образом:

jmespath.search('length([[email protected](@) >= `0`])',data)

Я пробовал сравнивать с nan и NaN, но это не работает, и, честно говоря, не должно, потому что nan не равно nan. Однако я не вижу функции is_nan(). Я полагаю, я мог бы преобразовать в строку, а затем сравнить их? Это похоже на крайний случай. Есть ли какой-то is_nan, который я не вижу в документах?


person frankc    schedule 12.02.2018    source источник
comment
Возможно, глупая идея в зависимости от вашего варианта использования, но вы можете вычесть из длины данных длину, отличную от nan (хотя измените > на >=).   -  person wim    schedule 12.02.2018
comment
@wim я хотел иметь ›=, который я отредактировал. Насколько я могу судить, выполнять арифметику в jmespath не так просто, но я думал об этом. Мне нужно изучить, если арифметика вещь   -  person frankc    schedule 12.02.2018
comment
JSON не знает NAN: stackoverflow.com/q/1423081/7311767   -  person Stephen Rauch    schedule 12.02.2018
comment
@Stephen Raunch, эта ссылка, кажется, утверждает, что она рассматривается как нулевая, но интересно, что в jmespath есть метод is_null(), но он не идентифицировал nans как нулевой. Я думаю, что в конечном итоге я попытаюсь добавить пользовательскую функцию в язык.   -  person frankc    schedule 12.02.2018


Ответы (1)


Контекст

  • питон 2.х или питон 3.х
  • jmespath-запрос

Проблема

  • как построить запрос, который подсчитывает экземпляры nan (не число)

Решение

  • используйте Jmespath not-expression ! (восклицательный знак) в сочетании с функцией abs()
  • используйте функцию jmespath length() для подсчета результатов

Пример

jmespath.compile('''[*].foo|[? !(abs(@) >= `0`)]|length([*])''').search(data)

Подробности

  • Функция Jmespath type() обрабатывает nan как number
  • Использование not-expression в сочетании с abs(@) greater-than or equal-to zero возвращает true для nan

Подводные камни

  • Jmespath выдает ошибку invalid type for value, если в abs() передается несовместимый тип (например, строка).
person dreftymac    schedule 23.03.2019