Разбор строки, представляющей список кортежей - PullRequest
15 голосов
/ 27 ноября 2009

У меня есть строки, которые выглядят так:

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

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

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

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

Ответы [ 6 ]

22 голосов
/ 27 ноября 2009
>>> import ast
>>> print ast.literal_eval("(8, 12.25), (13, 15), (16.75, 18.5)")
((8, 12.25), (13, 15), (16.75, 18.5))
4 голосов
/ 27 ноября 2009
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 голосов
/ 27 ноября 2009

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

1 голос
/ 28 ноября 2009

что не так делать систематически? разделить на ")", затем пройти по списку, удалить все "(".

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

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

1 голос
/ 27 ноября 2009

Скачать PyParsing .

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

1 голос
/ 27 ноября 2009

Если вы работаете с CSV-файлом и хотите больше, чем «простое» решение, которое не обрабатывает никаких ошибок, вам, вероятно, лучше всего использовать Python CSV-модуль .

...