1

给定一个标记列表和这些标记的适当的已知类型表示,我如何将类型映射到列表上?如果类型是int's 或者floats我可以调用int(x)一个字符串来将值转换为一个 int,但是如果我的类型是 a list(或者说 a numpy.array),这将失败。进行转换的最pythonic方式是什么?eval这里不是一个选项,因为数据基本上没有经过消毒。一个例子:

line     = "0 0 62.9695 [16.859,-17.1135,46.6351] [7.1759,29.3009,83.1399]"
tokens   = line.split()
type_key = [int,int,float,list,list] # Lists do not convert properly here

print [T(x) for T,x in zip(type_key,tokens)]

相关:如何在 Python 中将具有多种类型的列表转换为二进制?

4

2 回答 2

8

你想要的是ast.literal_eval(),它是为此目的而设计的。

>>> ast.literal_eval("[16.859,-17.1135,46.6351]")
[16.859, -17.1135, 46.6351]

编辑:根据您评论中的问题:

def literal_eval_to_array(literal):
    return np.array(ast.literal_eval(literal))

然后你可以简单地literal_eval_to_array()在你的type_key- 记住函数调用和实例化与 Python 相同。

于 2012-10-25T14:39:45.363 回答
1

我认为对你来说最好的方法是创建一个类型到转换器函数的映射,然后你可以拥有你想要的尽可能复杂的转换器,例如

import ast
def convert_list(str_val):
    return ast.literal_eval(str_val)

def convert_array(str_val):
    # do something here
    return []

converter_map = {
    list: convert_list,
    'np.array': convert_array
}

def convert(str_val, _type):
    converter = _type
    if _type in converter_map:
        converter = converter_map[_type]
    return converter(str_val)

line     = "0 0 62.9695 [16.859,-17.1135,46.6351] [7.1759,29.3009,83.1399]"
type_key = [int,int,float,list,list] 

print [convert(v, t) for v, t in zip(line.split(), type_key)]

输出:

[0, 0, 62.969499999999996, [16.859000000000002, -17.113499999999998, 46.635100000000001], [7.1759000000000004, 29.300899999999999, 83.139899999999997]]

这使它成为一个非常灵活的方案,您可以以非常灵活的方式清理和处理您的输入

于 2012-10-25T15:00:04.713 回答