包含NaN的元组列表(字符串,浮点数)如何获取最小值?
我有一个包含多个元组(每个元组里有一个字符串和一个浮点数)的列表,这些浮点数中有一些是 float('nan')
(表示不是一个数字)。我想找出里面最小的数字,但如果我用最小值函数 min
,总是会得到 nan
。
[('GroundBasedMechWT', nan), ('GroundBasedCTL', nan), ('GroundBasedManualWT', nan), ('GroundBasedManualLog', nan), ('CableManualWTLog', 60.77), ('CableManualWT', 58.52), ('CableManualLog', 68.17), ('CableManualCTL', nan), ('HelicopterManualWT', 96.82), ('HelicopterManualCTL', nan)]
4 个回答
0
nan=float('NaN')
x=[('GroundBasedMechWT', nan), ('GroundBasedCTL', nan), ('GroundBasedManualWT', nan), ('GroundBasedManualLog', nan), ('CableManualWTLog', 60.77), ('CableManualWT', 58.52), ('CableManualLog', 68.17), ('CableManualCTL', nan), ('HelicopterManualWT', 96.82), ('HelicopterManualCTL', nan)]
val=('foo', float('Inf')) #thanks for teaching me that
for tup in x:
if tup[1]<val[1]:
val=tup
print val
在空列表上会出错,但在其他情况下能解决问题。
3
你可以使用一个自定义的键,这样可以让NaN
返回一个非常大的值:
min(list, key=lambda x: float('inf') if math.isnan(x[1]) else x[1])
1
你也可以试试这个:
min(filter(lambda t: not math.isnan(t[1]), l), key=itemgetter(1))
这里的 itemgetter
是指 operator.itemgetter
。