1

假设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([?@.foo.abs(@) >= `0`])',data)

我尝试过比较nanNaN但这不起作用,坦率地说,它不应该是因为 nan 不等于 nan。但是,我看不到 is_nan() 函数。我想我可以转换为字符串然后比较它们?这似乎是最后的手段。是否有一些 is_nan 我没有看到记录?

4

1 回答 1

0

语境

  • 蟒蛇 2.x 或蟒蛇 3.x
  • jmespath 查询

问题

  • 如何构造一个计算nan(不是数字)实例的查询

解决方案

  • 使用 Jmespath not-expression !(感叹号)结合abs()函数
  • 使用 jmespathlength()函数计算结果

例子

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

细节

  • Jmespathtype()函数nan视为number
  • 与返回 truenot-expression结合使用abs(@) greater-than or equal-to zeronan

陷阱

  • invalid type for value如果传入不兼容的类型abs()(例如字符串),Jmespath 会出错。
于 2019-03-23T01:00:08.593 回答