gpt4 book ai didi

python - 将字符串转换为 float ,无需静默 NaN/Inf 转换

转载 作者:行者123 更新时间:2023-11-30 23:58:35 25 4
gpt4 key购买 nike

我想使用 Python 2.6 及更高版本将字符串转换为 float ,但没有默默地转换诸如 'NaN''Inf' 使物体漂浮。我确实希望它们被默默地忽略,就像任何无效的 float 表示文本一样。

在 2.6 之前,float("NaN") 在 Windows 上会引发 ValueError。现在它返回一个 float,其中 math.isnan() 返回 True,这对我的应用程序来说不是有用的行为。 (正如所指出的,这一直是一种依赖于平台的行为,但无论它发生在什么地方,对于我的目的来说,都认为这是一种不良行为。)

这是我目前所拥有的:

import math
def get_floats(source):
for text in source.split():
try:
val = float(text)
if math.isnan(val) or math.isinf(val):
raise ValueError
yield val
except ValueError:
pass

这是一个生成器,我可以为其提供包含表示实数的空格分隔序列的字符串。我希望它只产生那些纯粹是 float 字表示的字段,如“1.23”或“-34e6”,但不产生“NaN”或“-Inf”等。根本不是 float 的东西,例如“hello”也应该被忽略。

测试用例:

assert list(get_floats('1.23 foo -34e6 NaN -Inf')) == [1.23, -34000000.0]

请提出您认为更优雅的替代方案,即使它们涉及“三思而后行”(这在 Python 中通常被认为是次要的方法)。

编辑以澄清非 float 文本(例如“hello”)也应该被悄悄忽略。目的是只提取那些实数,而忽略其他所有内容。

最佳答案

我会这样写。我认为它结合了简洁性和可读性。

def is_finite(x):
return not math.isnan(x) and not math.isinf(x)

def get_floats(source):
for x in source.split():
try:
yield float(x)
except ValueError:
pass

def get_finite_floats(source):
return (x for x in get_floats(source) if is_finite(x))

关于python - 将字符串转换为 float ,无需静默 NaN/Inf 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2980883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com