我有一个词典
val_dict - {'val1': 'abcd', 'val': '1234', 'val3': '1234.00', 'val4': '1abcd 2gfff'}
我的键的所有值都是字符串。
所以我的问题是如何在字典中查找我的值的类型。
我的意思是,如果我说.int(val_dict ['val1'])会给我错误。
基本上我要做的是找出字符串是实际字符串还是int或float。
if int( val_dict['val1'):
dosomething
else if float(val_dict['val1']):
dosomething
感谢
答案 0 :(得分:3)
也许这个:
is_int = True
try:
as_int = int (val_dict['val1'])
except ValueError:
is_int = False
as_float = float (val_dict['val1'])
if is_int:
...
else:
...
你可以摆脱is_int
,但是try...except
会有很多代码(所有浮点值处理),我会对此感到不安。
答案 1 :(得分:2)
所有值当然是“实际字符串”(您可以使用字符串完成它们!)但我认为大多数受访者都知道您的意思 - 您希望尝试依次将每个值转换为几个可能的类型('int'然后'float'特别是你的名字,但不能有其他的......?)并返回并使用第一个成功的转换。
这当然最好是封装在一个函数中,远离你的应用程序逻辑。如果符合您需求的最佳匹配只是进行转换并返回“最佳转换值”(并且它们都将被类似地使用),那么:
def best_convert(s, types=(int, float)):
for t in types:
try: return t(s)
except ValueError: continue
return s
如果你想在每种情况下做一些不同的事情,那么:
def dispatch(s, defaultfun, typesandfuns):
for t, f in typesandfuns:
try:
v = t(s)
except ValueError:
continue
else:
return f(v)
return defaultfun(s)
被称为,例如,
r = dispatch(s, asstring, ((int, asint), (float, asfloat)))
如果要调用“nonconvertible strings”的函数,可转换为int的函数和可转换为float而不是int的函数分别为asstring
,asint
,asfloat
。< / p>
我不建议将“结构”“依次尝试转换为这些不同的类型并采取相应的行动”代码与您的“应用程序逻辑”不可分割的混合 - 这是一个明显的案例这两个方面整齐划分,具有良好的结构和分离。
答案 2 :(得分:0)
您可以非常轻松地确定字符串是否会转换为int或float,而不使用异常
# string has nothing but digits, so it's an int
if string.isdigit():
int(string)
# string has nothing but digits and one decimal point, so it's a float
elif string.replace('.', '', 1).isdigit():
float(string)
答案 3 :(得分:-1)
一个简单的解决方案,如果你没有太多格式,可能需要检查每个值的格式。
def intlike(value):
return value.isdigit()
def floatlike(value):
import re
return re.match("^\d+\.\d+$")
if intlike(val_dict['val1']):
dosomething(int(val_dict['val1']))
elif floatlike(val_dict['val1']):
somethingelse(float(val_dict['val1']))
else:
entirelydifferent()
然而,对某些复杂格式使用Python的异常框架确实更容易:
def floatlike(value):
try:
float(value)
except ValueError:
result = False
else:
result = True
return result