我有一些Python代码通过一个字符串列表运行,如果可能的话将它们转换为整数或浮点数 . 对整数执行此操作非常简单
if element.isdigit():
newelement = int(element)
浮点数更难 . 现在我正在使用 partition('.')
拆分字符串并检查以确保一侧或两侧都是数字 .
partition = element.partition('.')
if (partition[0].isdigit() and partition[1] == '.' and partition[2].isdigit())
or (partition[0] == '' and partition[1] == '.' and partition[2].isdigit())
or (partition[0].isdigit() and partition[1] == '.' and partition[2] == ''):
newelement = float(element)
这是有效的,但显然if语句有点像熊 . 我考虑的另一个解决方案是将转换包装在try / catch块中,看看它是否成功,如this question中所述 .
有没有其他想法?关于分区和try / catch方法的相对优点的意见?
13 回答
我会用...
..它很简单,而且很有效
另一种选择是正则表达式:
用于检查float的Python方法:
不要被隐藏在浮船中的地精弄掉!做单位测试!
什么是,而不是浮动可能会让你感到惊讶:
只有在数字字符串中有一个或没有'.'时才会返回
true
.将返回
false
将返回
false
如果你关心性能(我不建议你应该这样做),基于尝试的方法是明显的赢家(与基于分区的方法或正则表达式方法相比),只要你不期望很多无效字符串,在这种情况下它可能更慢(可能是由于异常处理的成本) .
同样,我并不是建议你关心性能,只是在你每秒100亿次这样做的情况下给你数据 . 此外,基于分区的代码不处理至少一个有效字符串 .
这里's the code (Python 2.6, regexp taken from John Gietzen' s answer):
TL;DR :
如果您的输入主要是可以转换为浮点数的字符串,
try: except:
方法是最好的本机Python方法 .如果您的输入主要是无法转换为浮点数的字符串,则正则表达式或分区方法会更好 .
如果您1)不确定您的输入或需要更高的速度2)不介意并且可以安装第三方C扩展,fastnumbers非常有效 .
通过名为fastnumbers的第三方模块可以使用另一种方法(披露,我是作者);它提供了一个名为isfloat的函数 . 我在this answer中采用了Jacob Gabrielson概述的单元测试示例,但添加了
fastnumbers.isfloat
方法 . 我还应该注意到雅各布的例子并没有对正则表达式选项做出正确的判断,因为该例子中的大部分时间都花在了全局查找上,因为点运算符......我修改了这个函数,以便与try: except:
进行更公平的比较 .在我的机器上,输出是:
正如你所看到的,正则表达式实际上并没有它最初看起来那么糟糕,如果你真的需要速度,那么
fastnumbers
方法就相当不错了 .只是为了变化,这是另一种方法 .
编辑:我确定它不会阻止浮动的所有情况,尤其是当有指数时 . 解决它看起来像这样 . 这将返回True只有val是一个浮点数,而假的是int,但可能性能低于正则表达式 .
这个正则表达式将检查科学浮点数:
但是,我相信你最好的选择是尝试使用解析器 .
如果您不需要担心数字的科学或其他表达方式,并且只使用可能是带或不带句点的数字的字符串:
Function
Lambda version
Example
这样你就不会意外地将应该是int的东西转换成浮点数 .
我使用了已经提到的功能,但很快我注意到字符串为“Nan”,“Inf”,它的变化被认为是数字 . 所以我建议你改进版本的函数,它将在这些类型的输入上返回false并且不会失败“1e3”变体:
尝试转换为float . 如果出现错误,请打印ValueError异常 .
输出:
我正在寻找一些类似的代码,但看起来使用try / excepts是最好的方法 . 这是我正在使用的代码 . 如果输入无效,它包括重试功能 . 我需要检查输入是否大于0和如果是这样将它转换为浮点数 .
似乎很简单 .
处理以字符串或int或float存储的值
Simplified version of the function
is_digit(str)
,在大多数情况下都足够了(不考虑指数表示法和"NaN"值):