找出类型的最佳方法

时间:2010-04-23 19:29:48

标签: python

我有一个词典

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

感谢

4 个答案:

答案 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的函数分别为asstringasintasfloat。< / 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