用python方法转换具有多个类型的列表(包括列表!)

2024-04-18 06:17:34 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个令牌列表和这些令牌的正确的已知类型表示,如何将该类型映射到该列表?如果类型是int的或floats,我可以通过字符串调用int(x)将值转换为int,但是如果我的类型是list(或者说是numpy.array),那么就失败了。什么是最Python式的转换方式?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)]

相关:How to convert a list with multiple types to binary in Python?


Tags: tokey字符串innumpy类型convert列表
2条回答

您需要的是^{},它是为此目的而设计的。在

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

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

^{pr2}$

然后您可以在您的type_key中使用literal_eval_to_array()-记住函数调用和实例化与Python是相同的。在

我认为最好的方法是创建一个类型到转换函数的映射,然后您可以拥有任意复杂的转换器

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)]

输出:

^{pr2}$

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

相关问题 更多 >