Допустим, у меня есть эта строка, как это:Преобразовать строку в список
string = ("['1.345', '1.346', '1.347']")
Так форматированием как список, но мне нужно, чтобы преобразовать его в реальный объект списка. Как я могу это сделать?
Допустим, у меня есть эта строка, как это:Преобразовать строку в список
string = ("['1.345', '1.346', '1.347']")
Так форматированием как список, но мне нужно, чтобы преобразовать его в реальный объект списка. Как я могу это сделать?
Вы можете использовать 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']"
работает просто отлично.
Чтобы уточнить, это (намного, намного) лучше, чем 'eval', потому что он оценивает только литералы, а не фактический код. Таким образом, не возникает проблема безопасности при произвольном вводе пользователя. – katrielalex
string = ("['1.345', '1.346', '1.347']")
lst = eval(string)
Argh, представьте, что это пользовательский ввод ... Что еще это должно быть? –
Да. «Literal_eval» Правэна лучше –
Я лишит «[», «]». И т.д., и использовать метод расщепления() на этой строке ..
lst = string.replace('[','').replace(']','').replace("'",'').replace(" ",'').split(',')
Я думаю, что это безопаснее, чем Eval, если строка хорошо отформатирован, но не очень эффективно, потому что Python должен создать новую строку с каждым методом замены.
Это могло бы помочь, если бы мы знали, откуда взялись эти строки. В общем, ответ Правеена - хороший пример того, что вы даете. Я хотел бы отметить, однако, что использование 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
Возможно, это альтернатива для вас.
Отбросив тот факт, что OP должен был бы преобразовать кавычки в свои строки, почему вы думаете, что модуль json менее гибкий, чем модуль ast в этом контексте? – jena
Да, на самом деле я должен согласиться с тобой, JSON может представлять любые данные, которые могут писать литералы Python. Удалено мой комментарий :) –
Откуда взялся этот список? –