2013-12-14 36 views
2

我对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应用于每个项目匹配的元素,例如:

​​

,但我肯定有一个更好的解决方案!感谢您的任何建议!

+0

是的,@roippi的建议工作得很好。非常感谢! – HDR

+0

而@ John1024也提出了这个,谢谢! – HDR

回答

6

不是字符串列表中,使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需要与字符串首先要格式化)

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'] 
+0

这不适用于日期。我得到ValueError:格式不正确的字符串 – Totem

+0

嗨,谢谢你的建议。不幸的是,它似乎不适合我。该错误读取:'ValueError:格式错误的字符串' – HDR

+0

是的,你是对的。坚持......(这就是我在同一时间接听和看电视时得到的) – mgilson

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)] 
相关问题