You can do like this:
define your own isdigit()
function which works for float
and int
both because default isdigit()
only works for int
:
x = [['3.14', 'Pi and radius', '20', 'False', 'False', '10'],
['201', 'Eulers', 'True', '9.18922', 'False', '12', '90']]
def isdigit(digit): #define your own isdigit() function which works for float and int both because default isdigit() only works for int
try:
float(digit)
return 0
except ValueError:
return 1
check={'True':True,'False':False} #define True , False dict
Now :
In one line solution:
list_1=[[float(sub_item) if '.' in sub_item else int(sub_item) if isdigit(sub_item) == 0 else check.get(sub_item) if sub_item == 'True' or sub_item == 'False' else sub_item for sub_item in item]for item in x]
print(list_1)
output:
[[3.14, 'Pi and radius', 20, False, False, 10], [201, 'Eulers', True, 9.18922, False, 12, 90]]
Detailed Solution:
Above list comprehension is same as :
final_list=[] # logic is from here
for item in x:
if isinstance(item,list):
sub_list=[]
#sub_list for keep tracking of nested list in origional list
for sub_item in item:
if isdigit(sub_item)==0: #passing value to isdigit() function
if '.' in sub_item: #float contain '.'
sub_list.append(float(sub_item))
else: #else it will be int
sub_list.append(int(sub_item))
elif sub_item=='True' or sub_item=='False':
sub_list.append(check.get(sub_item)) #get value from check dict
else:
sub_list.append(sub_item) #else append remaining items
final_list.append(sub_list)
print(final_list)
output:
[[3.14, 'Pi and radius', 20, False, False, 10], [201, 'Eulers', True, 9.18922, False, 12, 90]]