Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

converting string to tuple

I need to write a function that takes a string '(1,2,3,4,5),(5,4,3,2,1)' and returns a list of tuples of the 1st and last element of each tuple, [(1,5),(5,1)]. I was thinking:

def f(givenstring):     a=givenstring.split(',')     for i in a[0:-1]:         tuple(int(i[0,-1])) 

but here I'm stucked..

like image 404
Linus Svendsson Avatar asked Dec 13 '11 18:12

Linus Svendsson


People also ask

How do you convert a string to a tuple?

When it is required to convert a string into a tuple, the 'map' method, the 'tuple' method, the 'int' method, and the 'split' method can be used. The map function applies a given function/operation to every item in an iterable (such as list, tuple). It returns a list as the result.

Which of the following is used to convert string into tuple?

Python's built-in function tuple() converts any sequence object to tuple. If it is a string, each character is treated as a string and inserted in tuple separated by commas. Any non-sequence object as argument results in TypeError.

How do you convert a comma separated string to a tuple in Python?

you can use the . split() function to convert comma-separated values string to list and then use the tuple() method to convert the list to a tuple.


2 Answers

You can use ast.literal_eval():

Safely evaluate an expression node or a string containing a Python expression. The string or node provided may only consist of the following Python literal structures: strings, numbers, tuples, lists, dicts, booleans, and None.

This can be used for safely evaluating strings containing Python expressions from untrusted sources without the need to parse the values oneself.

In your example:

from ast import literal_eval s = '(1,2,3,4,5),(5,4,3,2,1)'  l = literal_eval(s) print l # ((1, 2, 3, 4, 5), (5, 4, 3, 2, 1))  print [(x[0], x[-1]) for x in l] # [(1, 5), (5, 1)] 
like image 73
tito Avatar answered Oct 04 '22 05:10

tito


You may use eval. I think it'll be the shortest one.

>>> 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)] 

Still, it's not a good practice to use eval.

Another option is to parse the string using re module.

>>> a = re.findall('\([^)]*\)',s) >>> a ['(1,2,3,4,5)', '(5,4,3,2,1)'] 

Regexp pattern means this:

\( #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)] 

Also, you may do the following:

>>> [tuple(int(i) for i in el.strip('()').split(',')) for el in s.split('),(')] [(1, 2, 3, 4, 5), (5, 4, 3, 2, 1)] 

This approach takes not modules at all. But it's not very robust (if the input string will have some inconsistency, e.g. space between parentheses and comma ...), (..., then noting will work).

like image 38
ovgolovin Avatar answered Oct 04 '22 03:10

ovgolovin