2012-02-27 2 views
1

Допустим, у меня есть эта строка, как это:Преобразовать строку в список

string = ("['1.345', '1.346', '1.347']") 

Так форматированием как список, но мне нужно, чтобы преобразовать его в реальный объект списка. Как я могу это сделать?

+1

Откуда взялся этот список? –

ответ

13

Вы можете использовать literal_eval с модуля ast.

>>> string = ("['1.345', '1.346', '1.347']") 
>>> import ast 
>>> lst = ast.literal_eval(string) 
>>> lst 
['1.345', '1.346', '1.347'] 

Кстати, вам не нужны круглые скобки вокруг строки. string = "['1.345', '1.346', '1.347']" работает просто отлично.

+2

Чтобы уточнить, это (намного, намного) лучше, чем 'eval', потому что он оценивает только литералы, а не фактический код. Таким образом, не возникает проблема безопасности при произвольном вводе пользователя. – katrielalex

2
string = ("['1.345', '1.346', '1.347']") 
lst = eval(string) 
+1

Argh, представьте, что это пользовательский ввод ... Что еще это должно быть? –

+0

Да. «Literal_eval» Правэна лучше –

0

Я лишит «[», «]». И т.д., и использовать метод расщепления() на этой строке ..

lst = string.replace('[','').replace(']','').replace("'",'').replace(" ",'').split(',') 

Я думаю, что это безопаснее, чем Eval, если строка хорошо отформатирован, но не очень эффективно, потому что Python должен создать новую строку с каждым методом замены.

1

Это могло бы помочь, если бы мы знали, откуда взялись эти строки. В общем, ответ Правеена - хороший пример того, что вы даете. Я хотел бы отметить, однако, что использование doublequotes вместо singlequotes в вашей строке будет делать все это действует в формате JSON, в этом случае вы также можете сделать:

import json 
json.loads('["1.345", "1.346", "1.347"]') # [u'1.345', u'1.346', u'1.347'] 

Измерение производительности:

import timeit 

s = """\ 
import ast 
ast.literal_eval("['1.345', '1.346', '1.347']") 
""" 

t = timeit.Timer(stmt=s) 
print "%.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000) 

Результат: 21,25 мксек/передача

против

import timeit 

s = """\ 
import json 
json.loads('["1.345", "1.346", "1.347"]') 
""" 

t = timeit.Timer(stmt=s) 
print "%.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000) 

Результат: 6,32 usec/pass

Возможно, это альтернатива для вас.

+0

Отбросив тот факт, что OP должен был бы преобразовать кавычки в свои строки, почему вы думаете, что модуль json менее гибкий, чем модуль ast в этом контексте? – jena

+0

Да, на самом деле я должен согласиться с тобой, JSON может представлять любые данные, которые могут писать литералы Python. Удалено мой комментарий :) –

Смежные вопросы