Sometimes, while working with Python we can have a problem in which we have a list of records in form of tuples in stringified form and we desire to convert them to a list of tuples. This kind of problem can have its occurrence in the data science domain. Let’s discuss certain ways in which this task can be performed.
Method 1 (Using eval() + list comprehension): This problem can be easily performed as a one-liner using the inbuilt function of eval(), which performs this task of string to tuple conversion and list comprehension.
Python3
# Python3 code to demonstrate working of # Converting string tuples to list tuples # using list comprehension + eval() # Initializing list test_list = [ "('gfg', 1)" , "('is', 2)" , "('best', 3)" ] # printing original list print ( "The original list is : " + str (test_list)) # Converting string tuples to list tuples # using list comprehension + eval() res = [ eval (ele) for ele in test_list] # printing result print ( "The list tuple after conversion : " + str (res)) |
The original list is : ["('gfg', 1)", "('is', 2)", "('best', 3)"] The list tuple after conversion : [('gfg', 1), ('is', 2), ('best', 3)]
Time complexity: O(n), where n is the length of the input list.
Auxiliary space: O(n), as we are creating a new list with the same length as the input list.
Method 2 (Using eval() + map()): This task can also be performed using a combination of the above functions. The task performed by list comprehension above can be performed using a map() in this method.
Python3
# Python3 code to demonstrate working of # Converting string tuples to list tuples # using map() + eval() # Initializing list test_list = [ "('gfg', 1)" , "('is', 2)" , "('best', 3)" ] # printing original list print ( "The original list is : " + str (test_list)) # Converting string tuples to list tuples # using map() + eval() res = list ( map ( eval , test_list)) # printing result print ( "The list tuple after conversion : " + str (res)) |
The original list is : ["('gfg', 1)", "('is', 2)", "('best', 3)"] The list tuple after conversion : [('gfg', 1), ('is', 2), ('best', 3)]
Time Complexity: O(n), where n is the number of elements in the input list.
Auxiliary Space: O(n), where n is the number of elements in the input list, for the output list.
Method 3: Using the enumerate function
Python3
s = [ "('gfg', 1)" , "('is', 2)" , "('best', 3)" ] x = [ eval (i) for a,i in enumerate (s)] print (x) |
[('gfg', 1), ('is', 2), ('best', 3)]
Time complexity: O(n), where n is the length of the list ‘s’.
Auxiliary space: O(n), where n is the length of the list ‘s’.
Method 4: Using map()+eval()
Python3
s = [ "('gfg', 1)" , "('is', 2)" , "('best', 3)" ] x = list ( map ( eval ,s)) print (x) |
[('gfg', 1), ('is', 2), ('best', 3)]
The time complexity of the program is O(n), where n is the length of the list “s”.
The auxiliary space complexity of the program is also O(n), as the list “x” has to store n elements, where n is the length of the input list “s”.
Method#5: Using Regex method.
Python3
# Python3 code to demonstrate working of # Converting string tuples to list tuples # Using regex import re # Initializing list test_list = [ "('gfg', 1)" , "('is', 2)" , "('best', 3)" ] # printing original list print ( "The original list is : " + str (test_list)) # Converting string tuples to list tuples # using regex res = [ tuple ( map ( int , re.findall(r '\d+' , i))) if j.isdigit() else (j.strip( "(')" ), int (k)) for i in test_list for j, k in re.findall(r "\('(.*?)', (.*?)\)" , i)] # printing result print ( "The list tuple after conversion : " + str (res)) #this code contributed by tvsk |
The original list is : ["('gfg', 1)", "('is', 2)", "('best', 3)"] The list tuple after conversion : [('gfg', 1), ('is', 2), ('best', 3)]
Time Complexity: O(n)
Auxiliary Space: O(n)
Method 6: (Using ast.literal_eval() instead of eval())
The ast module provides a safer way to evaluate string literals. The ast.literal_eval() function can evaluate a string containing a Python expression or a container object literal and return the corresponding object. It only evaluates literals, so it won’t execute arbitrary code like eval().
Python3
import ast # Initializing list test_list = [ "('gfg', 1)" , "('is', 2)" , "('best', 3)" ] # printing original list print ( "The original list is : " + str (test_list)) # Converting string tuples to list tuples # using ast.literal_eval() instead of eval() # ast.literal_eval() is a safer way to evaluate string literals # it only evaluates literals, so it won't execute arbitrary code like eval() res = [ast.literal_eval(ele) for ele in test_list] # printing result print ( "The list tuple after conversion : " + str (res)) |
The original list is : ["('gfg', 1)", "('is', 2)", "('best', 3)"] The list tuple after conversion : [('gfg', 1), ('is', 2), ('best', 3)]
Time Complexity: O(n)
Auxiliary Space: O(n)