2013-12-14 2 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 как таковой:

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

но я «Конечно, должно быть лучшее решение! Спасибо за любые предложения!

+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 требует string- в первую очередь)

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)] 
Смежные вопросы