将列表项转换为已定义的数据类型

时间:2013-12-14 19:20:29

标签: python list types type-conversion

我对python很新,我不知道如何做以下事情。

我有一个列表foo,其中包含某个图表的元数据和测量值。例如,plotID,调查日期,测量员的姓名首字母,多个测量值和分类变量。

foo= ['plot001', '01-01-2013', 'XX', '10', '12.5', '0.65', 'A']

因为从.txt读取这些数据,所有列表项都是字符串。我的问题是:如何将每个列表项转换为适当的数据类型?。我可以列出所需的数据类型:

dType= ['str', 'str', 'str', 'int', 'float', 'float', 'float', 'str']

如果我可以将dType中的每个项目作为函数应用于foo中的匹配元素,那将是很好的:

out= [str(foo[0]), str(foo[1]), str(foo[2]), int(foo[3]), float(foo[4]), float(foo[5]), float(foo[6]), str(foo[7])]

但我确信必须有更好的解决方案!谢谢你的任何建议!

3 个答案:

答案 0 :(得分:7)

而不是字符串列表,使dType成为内置工厂列表:

dType= [str, str, str, int, float, float, str]

(我删除了额外的float

然后使用zip

[t(x) for t,x in zip(dType,foo)]
Out[6]: ['plot001', '01-01-2013', 'XX', 10, 12.5, 0.65, 'A']

加分:您甚至可以使用functools.partial来制作自己的工厂功能并以相同的方式应用它们。比如说,如果您希望该日期变成datetime对象:

def datetime_factory(format,s):
    from datetime import datetime
    return datetime.strptime(s,format)

from functools import partial

dType= [str, partial(datetime_factory,'%d-%m-%Y'), str, int, float, float, str]

[t(x) for t,x in zip(dType,foo)]
Out[29]: ['plot001', datetime.datetime(2013, 1, 1, 0, 0), 'XX', 10, 12.5, 0.65, 'A']

(这里需要我们自己的工厂def,因为partial只允许您部分应用最左边的参数,而strptime需要字符串 - 来-be-formatted first)

答案 1 :(得分:2)

foo= ['plot001', '01-01-2013', 'XX', '10', '12.5', '0.65', 'A']
fnlist= [str, str, str, int, float, float, str]
out = [fn(v) for fn, v in zip(fnlist, foo)]

答案 2 :(得分:1)

ast.literal_eval可能会有所帮助:

>>> import ast
>>> def evaluate(x):
...     try:
...         return ast.literal_eval(x)
...     except (ValueError,SyntaxError):
...         return x
... 
>>> map(evaluate, foo)
['plot001', '01-01-2013', 'XX', 10, 12.5, 0.65, 'A']