4

タプルのリスト(文字列、浮動小数点数)のリストがあり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

4 に答える 4

3

に対して非常に高い値を返すカスタム キーを使用できますNaN

min(list, key=lambda x: float('inf') if math.isnan(x[1]) else x[1])
于 2013-03-01T01:09:03.320 に答える
1

これを試すこともできます:

min(filter(lambda t: not math.isnan(t[1]), l), key=itemgetter(1))

itemgetter参照しoperator.itemgetterます。

于 2013-03-01T01:14:27.647 に答える
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)]
>>> nan<1
False
>>> nan<1.0
False
>>> min(x)
('CableManualCTL', nan)

nan は通常の float よりも小さいとは見なされません。おそらく min は文字列をアルファベット順に比較しています。

(完全な答えではありませんが、役立つかもしれません)

于 2013-03-01T01:24:09.067 に答える
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

空のリストでは失敗しますが、それ以外は問題を解決します。

于 2013-03-01T01:32:16.257 に答える