如何在Python中检查字符串是否表示数值?
def is_number(s):
try:
float(s)
return True
except ValueError:
return False
上述方法可行,但似乎很笨拙。
如果您正在测试的内容来自用户输入,那么即使它表示int或float,它仍然是一个字符串。请参阅如何将输入读取为数字?用于转换输入,并询问用户输入,直到他们给出有效响应以确保输入在继续之前表示int或float(或其他要求)。
在浮点数的最常见情况下,我们希望处理整数和小数。让我们以字符串“1.1”为例。
我会尝试以下方法之一:
1.>isnumeric()
word = "1.1"
"".join(word.split(".")).isnumeric()
>>> True
2.>isdigit()
word = "1.1"
"".join(word.split(".")).isdigit()
>>> True
3.>isdecimal()
word = "1.1"
"".join(word.split(".")).isdecimal()
>>> True
速度:
► 所有上述方法具有相似的速度。
%timeit "".join(word.split(".")).isnumeric()
>>> 257 ns ± 12 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit "".join(word.split(".")).isdigit()
>>> 252 ns ± 11 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit "".join(word.split(".")).isdecimal()
>>> 244 ns ± 7.17 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
我也有类似的问题。我想将字符串列表转换为浮点数,而不是定义isNumber函数,这在高级术语中是:
[ float(s) for s in list if isFloat(s)]
在给定的情况下,我们不能真正将float与isFloat函数分开:这两个结果应该由同一个函数返回。此外,如果float失败,整个过程将失败,而不仅仅是忽略错误元素。此外,“0”是一个有效的数字,应包含在列表中。当过滤掉坏元素时,一定不要排除0。
因此,必须以某种方式修改上述理解:
如果列表中的任何元素都无法转换,请忽略它并不要引发异常避免为每个元素多次调用float(一个用于转换,另一个用于测试)如果转换后的值为0,则它仍应出现在最终列表中
我提出了一个以C#的可空数值类型为灵感的解决方案。这些类型在内部由一个结构表示,该结构具有数值,并添加一个布尔值,指示该值是否有效:
def tryParseFloat(s):
try:
return(float(s), True)
except:
return(None, False)
tupleList = [tryParseFloat(x) for x in list]
floats = [v for v,b in tupleList if b]
在Alfe指出您不需要单独检查浮点数后更新,因为两者都是复杂的句柄:
def is_number(s):
try:
complex(s) # for int, long, float and complex
except ValueError:
return False
return True
之前说过:在一些罕见的情况下,您可能还需要检查复数(例如1+2i),这不能用浮点数表示:
def is_number(s):
try:
float(s) # for int, long and float
except ValueError:
try:
complex(s) # for complex
except ValueError:
return False
return True
这个怎么样:
'3.14'.replace('.','',1).isdigit()
只有当有一个或没有“”时,它才会返回真在数字串中。
'3.14.5'.replace('.','',1).isdigit()
将返回false
编辑:刚刚看到另一条评论。。。可以为其他情况添加.replace(badstuff,“”,maxnum_badstuff)。如果你传递的是盐而不是任意的调味品(参考:xkcd#974),这会很好:P