包含NaN的元组列表(字符串,浮点数)如何获取最小值?

4 投票
4 回答
2457 浏览
提问于 2025-04-17 17:31

我有一个包含多个元组(每个元组里有一个字符串和一个浮点数)的列表,这些浮点数中有一些是 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

撰写回答