2009-11-27 4 views
14

У меня есть строки, которые выглядят как это:Синтаксической строку, которая представляет собой список кортежей

"(8, 12.25), (13, 15), (16.75, 18.5)" 

, и я хотел бы преобразовать каждый из них в структуру питона данных. Предпочтительно список (или кортеж) кортежей, содержащих пару значений поплавка.

Я мог бы сделать это с помощью eval("(8, 12.25), (13, 15), (16.75, 18.5)"), который дает мне кортеж кортежей, но я не думаю, что наивная оценка внешней информации была бы разумным решением.

Итак, я подумал, как может выглядеть элегантное питоническое решение.

ответ

21
>>> import ast 
>>> print ast.literal_eval("(8, 12.25), (13, 15), (16.75, 18.5)") 
((8, 12.25), (13, 15), (16.75, 18.5)) 
+1

jfyi, это не может быть устойчивым к наличию одного кортеж в списке. Что делать, если вы ввели «(8, 12.25)» .Таким образом, вы получите только кортеж вместо кортежа в кортеже. Я считаю, что вы получите желаемый вложенный кортеж, если вход был «(8, 12.25), «(обратите внимание на конечную запятую). Но я не тестировал это, так как у меня нет установленного на этом компьютере python 2.6. – Tom

+0

Хорошо поймать Тома. Я еще об этом не думал, и на самом деле это было бы проблемой в моя ситуация. Я собираюсь проверить это после разбора. Спасибо за головы. К сожалению, метод не доступен в python2.5, но в моем случае это нормально, поскольку я использую его в сценарии импорта данных движка приложения, а не в самом приложении. – tosh

+0

+1: Не знал 'ast.literal_eval' раньше - и это так удобно! –

1

Если вы работаете с файлом CSV, и вы хотите больше, чем «наивной» решение, которое не обрабатывает любые ошибки, вы, вероятно, лучше с помощью Python's CSV module.

+0

Извините, я задал вопрос немного расплывчатым. Строка на самом деле является значением, которое я получаю как одно из значений, разделенных запятой и точкой с запятой. Я удалю бит CSV из вопроса, поскольку это может ввести в заблуждение. Кстати, я использую модуль CSV. Это здорово. Спасибо, что ответили. – tosh

1

Скачать PyParsing.

Я работал с ним раньше. Из этого вы можете получить довольно сильное поведение синтаксического анализа, и я думаю, что он предоставляет встроенные функции, которые будут обрабатывать все ваши синтаксические потребности с помощью такого рода вещей. Просмотрите запятую и нажмите кнопку.

3
def parse(s): 
    tuples = s.split('), ') 
    out = [] 
    for x in tuples: 
     a,b = x.strip('()').split(', ') 
     out.append((float(a),float(b))) 
    return out 

Это должно выполнить эту работу.

2

Я использовал safe_eval для подобных работ в прошлом.

1

Что плохого в этом плане? разделить на «)», а затем пройти через список, удалить все «(».

>>> 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'] 
[''] 

Теперь вы можете принести каждый элемент в вашей структуре данных.

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