Вы можете использовать eval
. Я думаю, это будет самый короткий.
>>> s = '(1,2,3,4,5),(5,4,3,2,1)'
>>> ts = eval(s)
>>> ts
((1, 2, 3, 4, 5), (5, 4, 3, 2, 1))
>>> tsp = [(el[0],el[-1]) for el in ts]
>>> tsp
[(1, 5), (5, 1)]
Тем не менее, это не является хорошей практикой использовать eval
.
Другой вариант - проанализировать строку, используя модуль re
.
>>> a = re.findall('\([^)]*\)',s)
>>> a
['(1,2,3,4,5)', '(5,4,3,2,1)']
Regexp модели означает следующее:
\(#opening parenthesis
[^)]* #from 0 to infinite symbols different from)
\) #closing parenthesis
.
>>> b = [el.strip('()') for el in a]
>>> b
['1,2,3,4,5', '5,4,3,2,1']
>>> c = [el.split(',') for el in b]
>>> c
[['1', '2', '3', '4', '5'], ['5', '4', '3', '2', '1']]
>>> d = [tuple(int(el2) for el2 in el) for el in c]
>>> d
[(1, 2, 3, 4, 5), (5, 4, 3, 2, 1)]
Кроме того, вы можете сделать следующее:
>>> [tuple(int(i) for i in el.strip('()').split(',')) for el in s.split('),(')]
[(1, 2, 3, 4, 5), (5, 4, 3, 2, 1)]
Этот подход не принимает модули на всех. Но он не очень надежный (если входная строка будет иметь некоторую несогласованность, например пробел между круглыми скобками и запятой ...), (...
, тогда заметка будет работать).
Думай больше как re.findall() или Eval() (но помните, Eval зло). Извините, нет времени для полного ответа. – pyroscope
Можете ли вы исправить форматирование кода? (По какой-то причине я не могу ..) – FakeRainBrigand
Связанный: [link] (http://stackoverflow.com/questions/1810109/parsing-a-string-which-represents-a-list-of-tuples) – FakeRainBrigand