3

How can I convert "[(5, 2), (1,3), (4,5)]" into a list of tuples [(5, 2), (1,3), (4,5)]

I am using planetlab shell that does not support "import ast". So I am unable to use it.

shivsn
  • 7,680
  • 1
  • 26
  • 33
Parikshit
  • 543
  • 1
  • 7
  • 16

3 Answers3

5

If ast.literal_eval is unavailable, you can use the (unsafe!) eval:

>>> s = "[(5, 2), (1,3), (4,5)]"
>>> eval(s)
[(5, 2), (1, 3), (4, 5)]

However, you should really overthink your serialization format. If you're transferring data between Python applications and need the distinction between tuples and lists, use pickle. Otherwise, use JSON.

phihag
  • 278,196
  • 72
  • 453
  • 469
  • I see if s = "[('a', 2), ('b',3), ('c',5)]" result is [(a, 2), (b, 3), (c, 5)] – Slim_user71169 Jul 25 '15 at 03:10
  • @Slim_user71169 That's not true in any Python I know of. Can you post a link to an online interpreter that shows the problem, [like this](http://ideone.com/5jbz8O)? – phihag Jul 25 '15 at 07:39
1

'join' replace following characters '()[] ' and creates string of comma separated numbers

5,2,1,3,4,5

'split' splits that string on ',' and creates list strings

['5','2','1','3','4','5']

'iter' creates iterator that will go over list of elements

and the last line uses a list comprehension using 'zip' to group together two numbers

it = iter("".join(c for c in data if c not in "()[] ").split(","))
result = [(int(x), int(y)) for x, y in zip(it, it)]

>>> [(5, 2), (1, 3), (4, 5)]
Vlad Bezden
  • 83,883
  • 25
  • 248
  • 179
1

If you don't trust the source of the string enough to use eval, then use re.

import re
tuple_rx = re.compile("\((\d+),\s*(\d+)\)")
result = []
for match in tuple_rx.finditer("[(5, 2), (1,3), (4,5)]"):
  result.append((int(match.group(1)), int(match.group(2))))

The code above is very straightforward and only works with 2-tuples of integers. If you want to parse more complex structures, you're better off with a proper parser.

9000
  • 39,899
  • 9
  • 66
  • 104