Python 找出类型的最佳方法

Python 找出类型的最佳方法,python,Python,我有一个口述 val_dict - {'val1': 'abcd', 'val': '1234', 'val3': '1234.00', 'val4': '1abcd 2gfff'} 我的键的所有值都是字符串 所以我的问题是,如何找出我在dict中的值的类型 我的意思是,如果我说“intval”['val1']会给我带来错误 基本上,我要做的是找出字符串是实际字符串还是int或float` if int( val_dict['val1'): dosomething else if float(

我有一个口述

val_dict - {'val1': 'abcd', 'val': '1234', 'val3': '1234.00', 'val4': '1abcd 2gfff'}
我的键的所有值都是字符串

所以我的问题是,如何找出我在dict中的值的类型

我的意思是,如果我说“intval”['val1']会给我带来错误

基本上,我要做的是找出字符串是实际字符串还是int或float`

if int( val_dict['val1'):
dosomething
else if float(val_dict['val1']):
dosomething
谢谢

也许是这样:

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中会有很多代码都是浮点值处理的…除了我对此感到不安。

可能是这样的:

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中会有很多代码都是浮点值处理的…除了我对此感到不安。

一个简单的解决方案,如果你没有太多的格式,可能需要检查每个值的格式

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

如果没有太多的格式,一个简单的解决方案可能涉及检查每个值的格式

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
当然,所有的值都是实际的字符串,您可以使用它们,您可以使用字符串!,但我认为大多数受访者都知道你的意思——你想尝试将每个值转换成几种可能的类型,依次是“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)))
如果要在不可转换字符串上调用的函数、可转换为int的函数和可转换为float但不可转换为int的函数分别为asstring、asint和asfloat

我不建议将结构转换成这些不同的类型,并相应地将代码与应用程序逻辑紧密地结合在一起-这是一个将这两个方面整齐地分层的明显例子,具有良好的结构和分离。

所有的值当然都是实际的字符串,您可以使用它们,您可以使用字符串!,但我认为大多数受访者都知道你的意思——你想尝试将每个值转换成几种可能的类型,依次是“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)))
如果要在不可转换字符串上调用的函数、可转换为int的函数和可转换为float但不可转换为int的函数分别为asstring、asint和asfloat


我不建议依次将结构转换为这些不同的类型,并相应地将代码与应用程序逻辑紧密地结合在一起-这是一个清晰的例子,可以将这两个方面整齐地分层,具有良好的结构和分离。

您可以很容易地确定字符串是否将转换为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)

您可以非常轻松地确定字符串是否将转换为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)

我想它实际上对你很重要,是int还是float?两者都支持相同的操作,当然精度不同。为什么它们是字符串?他们最初是怎么进入字典的?为什么在放入字典之前没有转换成正确的对象?给我dict的代码不在我手里。基本上我不能更改dict。我想它实际上对你很重要,是int还是float?两者都支持相同的操作,当然精度不同。为什么它们是字符串?他们最初是怎么进入字典的?为什么在放入字典之前没有转换成正确的对象?给我dict的代码不在我手里。基本上我不能改变这句话。另外,请注意S.洛特的评论。也许你甚至不需要这个,而是可以改进字典。另外,请注意S.洛特的评论。也许你甚至不需要这个,而是可以改进字典。你不需要使用正则表达式来匹配浮点,你的正则表达式也不会匹配所有可能的浮点。Python可以强制将“0.”和“.0”作为浮点数,而+是前面一个或多个浮点数的匹配项。@lunixbochs:这就是我推荐使用异常框架的原因。然而,如果数据来自一个已知的源,正则表达式可能总是匹配浮点值;it cer
例如,tainly看起来右侧的+是正确的。此外,这提供了一种检查问题中未明确要求的可能性的方法;例如,另一个正则表达式可以将“1abcd 2gfff”标识为列表。您不需要使用正则表达式来匹配浮点数,并且您的正则表达式也不会匹配所有可能的浮点数。Python可以强制将“0.”和“.0”作为浮点数,而+是前面一个或多个浮点数的匹配项。@lunixbochs:这就是我推荐使用异常框架的原因。然而,如果数据来自一个已知的源,正则表达式可能总是匹配浮点值;例如,右边的+看起来肯定是正确的。此外,这提供了一种检查问题中未明确要求的可能性的方法;例如,另一个正则表达式可以将“1abcd 2gfff”标识为列表。