Как преобразовать строку в кортеж - PullRequest
4 голосов
/ 26 сентября 2011

Мне нравится преобразовывать в скрипте Python следующую строку:

mystring='(5,650),(235,650),(465,650),(695,650)'

в список кортежей

mytuple=[(5,650),(235,650),(465,650),(695,650)]

, такой что print mytuple[0] приводит к:

(5,650)

Ответы [ 3 ]

13 голосов
/ 26 сентября 2011

Я бы использовал ast.literal_eval:

In [7]: ast.literal_eval('(5,650),(235,650),(465,650),(695,650)')
Out[7]: ((5, 650), (235, 650), (465, 650), (695, 650))

Как видно выше, это возвращает кортеж кортежей.Если вам нужен список кортежей, просто примените list() к результату.

1 голос
/ 26 сентября 2011

Использование eval

mytuple = eval(mystring)

Если вы хотите список, заключите в скобки mystring

mytuble=eval("[%s]" % mystring)

Это самое простое решение (нечего импортировать, работа с Python 2.5) Однако ast.literate_eval кажется более подходящим в оборонительном контексте.

1 голос
/ 26 сентября 2011

Это не кортеж, это список.

Если вы можете полагаться на то, что формат точно такой, как вы показали, вы, вероятно, можете сделать что-то подобное, чтобы преобразовать его в список:

mystring2 = mystring.translate(None, "()")
numbers = mystring2.split(",")
out = []
for i in xrange(len(numbers) / 2)
  out.append((int(numbers[2 * i), int(2 * i + 1])))

Вероятно, это можно улучшить с помощью лучшего механизма обхода списка. Это должно быть довольно ясно, однако.

Если вы действительно хотите кортеж кортежей, вы можете преобразовать окончательный список:

out2 = tuple(out)
...