[英]How can I convert a string to either int or float with priority on int?
當我想要這個時,我找不到另一個答案,所以我想我會為其他人發布我自己的解決方案,如果我做錯了也會得到更正。
我必須創建一個自動配置文件解析器,如果可能的話我更喜歡使用int,如果不是,我會浮動。 通常的try / except轉換本身不起作用,因為任何float都只會被強制轉換為int。
為了澄清有人問,案例基本上是將數字轉換為編寫配置文件數據的人。 所以帶小數的任何東西都可能是浮點數。 另外,由於浮點數的性質,我認為float對於某些運算符(例如==,<,>)可能是危險的,並且int將在必要時轉換為float。 因此,我希望數字盡可能保持在int中。 這不是一件大事,只是對我自己的一種約定。
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"
結果是什么?
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。
這是一次,獲得許可可能比先后請求寬恕更好,這通常被認為是“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)
最后,在一個稍微不同的軌道上,如果你想要浮點整數成為整數,你可以執行以下操作,這類似於_dammit_
Machin的“ _dammit_
”函數:
v = int(float(s)) if int(float(s)) == float(s) else float(s)
eval()
是一個接受字符串並將其作為Python代碼處理的函數。 當任何類型的文字作為字符串給出時,它將返回包含該值的Python對象。
但是,從安全角度來看,這是一個壞主意,因為有人可能會提供崩潰或篡改程序的指令。 在處理之前,您可以要求它是一組特定的字符,即:
eval(s) if not set(s).difference('0123456789.') else None
不過,這仍然不值得頭疼。 也就是說,你可以得到花哨,並允許表達式計算......這可能值得嘗試!
num = lambda s: eval(s) if not set(s).difference('0123456789. *+-/e') else None
>>> num('10')
10
>>> num('10.0')
10.0
>>> num('1e3')
1000.0
>>> num('4.8 * 10**34')
4.8e+34
>>> num('1+2/3')
1.6666666666666665
嘗試檢測浮點並不容易,但檢測可能的整數更容易。
我會嘗試檢查字符串是否只包含數字(忽略可能的前導空格或符號)並相應地轉換為float或integer:
lst = ['1' , '2.2' , ' -3','+5']
result = [int(x) if x.lstrip(" -+").isdigit() else float(x) for x in lst]
print(result)
打印:
[1, 2.2, -3, 5]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.