将python字符串列表转换为其类型

时间:2010-05-18 17:47:12

标签: python numpy scipy

给出一个python字符串列表,如何自动将它们转换为正确的类型?意思是,如果我有:

["hello", "3", "3.64", "-1"]

我希望将其转换为列表

["hello", 3, 3.64, -1]  

其中第一个元素是stirng,第二个元素是int,第三个是float,第四个是int。

我该怎么做?感谢。

7 个答案:

答案 0 :(得分:22)

import ast

L = ["hello", "3", "3.64", "-1"]

def tryeval(val):
  try:
    val = ast.literal_eval(val)
  except ValueError:
    pass
  return val

print [tryeval(x) for x in L]

答案 1 :(得分:8)

不使用评估:

def convert(val):
    constructors = [int, float, str]
    for c in constructors:
        try:
            return c(val)
        except ValueError:
            pass

答案 2 :(得分:3)

def tryEval(s):
  try:
    return eval(s, {}, {})
  except:
    return s

map(tryEval, ["hello", "3", "3.64", "-1"])

只有在您信任输入时才执行此操作。另外,请注意它不仅仅支持文字;算术表达式也将被评估。

答案 3 :(得分:1)

我使用json.loads方法

完成了同样的工作
def f(l):
    for i in l:
        try:
            yield json.loads(i)
        except:
            yield i

测试:

In [40]: l
Out[40]: ['hello', '3', '3.64', '-1']

In [41]: list(f(l))
Out[41]: ['hello', 3, 3.64, -1]

答案 4 :(得分:0)

如果你真的只对字符串,浮点数和整数感兴趣,我更喜欢更冗长,更不具备意识的

def interpret_constant(c):
    try:
        if str(int(c)) == c: return int(c)
    except ValueError:
        pass
    try:
        if str(float(c)) == c: return float(c)
    except ValueError:
        return c

test_list = ["hello", "3", "3.64", "-1"]

typed_list = [interpret_constant(x) for x in test_list]
print typed_list
print [type(x) for x in typed_list]

答案 5 :(得分:0)

这不是一个真正的答案,但我想指出当你拥有一个包含模式IDPARVAL的参数数据库时,这有多重要。例如:

ID  PAR      VAL
001 velocity '123.45'
001 name     'my_name'
001 date     '18-dec-1978'

当您不知道需要为特定ID存储多少参数时,此模式是合适的。缺点恰恰在于VAL中的值都是字符串,需要根据需要转换为正确的数据类型。您可以通过向架构添加第四列(称为TYPE)来执行此操作,也可以使用到目前为止提出的任何方法。

好问题!

PS。数据库架构与one of my previous questions

相关

答案 6 :(得分:0)

ryans的一个很好的解决方案,适用于numpy用户:

def tonum( x ):
    """ -> int(x) / float(x) / None / x as is """
    if np.isscalar(x):  # np.int8 np.float32 ...
    # if isinstance( x, (int, long, float) ):
        return x
    try:
        return int( x, 0 )  # 0: "0xhex" too
    except ValueError:
        try:
            return float( x )  # strings nan, inf and -inf too
        except ValueError:
            if x == "None":
                return None
            return x

def numsplit( line, sep=None ):
    """ line -> [nums or strings ...] """
    return map( tonum, line.split( sep ))  # sep None: whitespace