元组列表(字符串,浮点数)与 NaN 如何获得最小值?

Posted

技术标签:

【中文标题】元组列表(字符串,浮点数)与 NaN 如何获得最小值?【英文标题】:List of Tuples (string, float)with NaN How to get the min value? 【发布时间】:2013-02-15 10:04:56 【问题描述】:

我有一个带有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)]

【问题讨论】:

NaN吗? np.NaN? NameError: name 'nan' 未定义。你用的是哪个版本的python? 对不起。它是 float('NaN')。 【参考方案1】:

您可以使用自定义键,这将为 NaN 返回一个非常高的值:

min(list, key=lambda x: float('inf') if math.isnan(x[1]) else x[1])

【讨论】:

你的语法是错误的——它应该是key=lambda x: ...,这不会起作用,因为float('nan') == float('nan')永远不会是True。 (感谢 IEEE 委员会!) 那么我也可以用 inf 替换我的 NaN。我仍然不会得到最小数字作为回报。 是的。我知道了。那应该行得通。 +1。我知道一定有一个isnan 漂浮在某个地方(双关语)【参考方案2】:

你也可以试试这个:

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

其中itemgetter 指的是operator.itemgetter

【讨论】:

【参考方案3】:
>>> 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 被认为比普通花车小。可能 min 按字母顺序比较字符串。

(不是一个完整的答案,但可能会有所帮助)

【讨论】:

我认为这不应该是一个答案(也许是评论)。 试试1 &lt; nan1.0 &lt; nan,你会得到同样的结果(False)。即使nan == nan 也应该返回False。但你是对的,如果使用默认比较器比较元组,它将首先按字母顺序对第一个元素进行排序,然后如果两个元素具有相同的第一个元素,则使用第二个。 @A.R.S.:我担心如果没有一点代码,我就无法清楚地表达它【参考方案4】:
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

在空列表上失败,但可以解决问题。

【讨论】:

以上是关于元组列表(字符串,浮点数)与 NaN 如何获得最小值?的主要内容,如果未能解决你的问题,请参考以下文章

Python 整数 长整数 浮点数 字符串 列表 元组 字典的各种方法

Erlang复合数据结构基础之元组与列表

如何在 c 中产生 NaN 浮点数?

Python判断字符串是否为字母或者数字(浮点数)

Python3 Infinity/NaN:十进制与浮点数

浮点数.NaN == 浮点数.NaN