当我想要这个时,我找不到另一个答案,所以我想我会为其他人发布我自己的解决方案,如果我做错了也会得到更正。
我必须制作一个自动配置文件解析器,如果可能的话我更喜欢将数字设为int,如果没有则优先浮动。通常的try / except转换本身不起作用,因为任何float都只会被强制转换为int。
为了澄清有人问,案例基本上是将数字转换为编写配置文件数据的人。所以带小数的任何东西都可能是浮点数。此外,由于浮点数的性质,我认为float对于某些运算符(例如==,<,>)可能是危险的,并且int将在必要时转换为float。因此,我希望数字尽可能保持在int中。这不是一件大事,只是对我自己的一种约定。
答案 0 :(得分:23)
def int_or_float(s):
try:
return int(s)
except ValueError:
return float(s)
如果您希望将"10.0000"
转换为int,请尝试以下操作:
def int_dammit_else_float(s):
f = float(s)
i = int(f)
return i if i == f else f
您希望输入的结果如"1e25"
?
答案 1 :(得分:2)
这是有一段时间,获得许可可能比先后请求宽恕更好,这通常被认为是“Pythonic”做事的方式,通常涉及try/except
。所以像这样简单的东西可能就足够了:
v = float(s) if '.' in s or 'e' in s.lower() else int(s)
由于有多个字符可以指示浮点数,您还可以通过其他方式检查其中一个:
import re
pattern = re.compile(r'[.eE]')
v = float(s) if pattern.findall(s) else int(s)
或
chars = set('.eE')
v = float(s) if any((c in chars) for c in s) else int(s)
最后,在一个稍微不同的轨道上,如果你想要浮点整数成为整数,你可以做以下,这类似于@John Machin的“_dammit_
”函数:
v = int(float(s)) if int(float(s)) == float(s) else float(s)
答案 2 :(得分:2)
def int_float_none(x):
# it may be already int or float
if isinstance(x, (int, float)):
return x
# all int like strings can be converted to float so int tries first
try:
return int(x)
except (TypeError, ValueError):
pass
try:
return float(x)
except (TypeError, ValueError):
return None
对于传递的任何对象,上面的函数将返回int或float转换或None。
答案 3 :(得分:0)
尝试检测浮点数并不容易,但检测可能的整数更容易。
我会尝试检查字符串是否只包含数字(忽略可能的前导空格或符号)并相应地转换为float或integer:
std::list::iterator
打印:
lst = ['1' , '2.2' , ' -3','+5']
result = [int(x) if x.lstrip(" -+").isdigit() else float(x) for x in lst]
print(result)