Ответ 1
>>> import ast
>>> print ast.literal_eval("(8, 12.25), (13, 15), (16.75, 18.5)")
((8, 12.25), (13, 15), (16.75, 18.5))
У меня есть строки, которые выглядят следующим образом:
"(8, 12.25), (13, 15), (16.75, 18.5)"
и я хотел бы преобразовать каждую из них в структуру данных python. Предпочтительно список (или кортеж) кортежей, содержащих пару значений float.
Я мог бы сделать это с помощью eval("(8, 12.25), (13, 15), (16.75, 18.5)")
, который дает мне кортеж кортежей, но я не думаю, что наивная оценка внешней информации была бы разумным решением.
Итак, я подумал, как может выглядеть элегантное питоническое решение.
>>> import ast
>>> print ast.literal_eval("(8, 12.25), (13, 15), (16.75, 18.5)")
((8, 12.25), (13, 15), (16.75, 18.5))
def parse(s):
tuples = s.split('), ')
out = []
for x in tuples:
a,b = x.strip('()').split(', ')
out.append((float(a),float(b)))
return out
это должно выполнить эту работу.
Я использовал safe_eval для подобных работ в прошлом.
Если вы работаете с CSV файлом и хотите больше, чем "наивное" решение, которое не обрабатывает никаких ошибок, вам, вероятно, лучше всего использовать Python CSV-модуль.
Загрузите PyParsing.
Я работал с ним раньше. Из этого вы можете получить довольно сильное поведение синтаксического анализа, и я думаю, что он предоставляет встроенные функции, которые будут обрабатывать все ваши синтаксические потребности с помощью такого рода вещей. Найдите запятую и список вложенныхExpr.
что неправильно с его систематическим путем? split on ")", затем перейдите в список, удалите все "(".
>>> s="(8, 12.25), (13, 15), (16.75, 18.5)"
>>> [ i.replace("(","") for i in s.split(")") ]
['8, 12.25', ', 13, 15', ', 16.75, 18.5', '']
>>> b = [ i.replace("(","") for i in s.split(")") ]
>>> for i in b:
... print i.strip(", ").replace(" ","").split(",")
...
['8', '12.25']
['13', '15']
['16.75', '18.5']
['']
Теперь вы можете привести каждый элемент в свою структуру данных.