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..
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.
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.
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.
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)]
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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With