元组列表(字符串,浮点数)与 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 < nan
和1.0 < 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 如何获得最小值?的主要内容,如果未能解决你的问题,请参考以下文章