I have a list which looks something like this:
['1', '2', '3.4', '5.6', '7.8']
How do I change the first two to int
and the three last to float
?
I want my list to look like this:
[1, 2, 3.4, 5.6, 7.8]
Use a conditional inside a list comprehension
>>> s = ['1', '2', '3.4', '5.6', '7.8']
>>> [float(i) if '.' in i else int(i) for i in s]
[1, 2, 3.4, 5.6, 7.8]
Interesting edge case of exponentials. You can add onto the conditional.
>>> s = ['1', '2', '3.4', '5.6', '7.8' , '1e2']
>>> [float(i) if '.' in i or 'e' in i else int(i) for i in s]
[1, 2, 3.4, 5.6, 7.8, 100.0]
Using isdigit
is the best as it takes care of all the edge cases (mentioned by Steven in a comment)
>>> s = ['1', '2', '3.4', '5.6', '7.8']
>>> [int(i) if i.isdigit() else float(i) for i in s]
[1, 2, 3.4, 5.6, 7.8, 100.0]
Use a helper function:
def int_or_float(s):
try:
return int(s)
except ValueError:
return float(s)
Then use a list comprehension to apply the function:
[int_or_float(el) for el in lst]
Why not use ast.literal_eval
?
import ast
[ast.literal_eval(el) for el in lst]
Should handle all corner cases. It's a little heavyweight for this use case, but if you expect to handle any Number-like string in the list, this'll do it.
Use isdigit method of string:
numbers = [int(s) if s.isdigit() else float(s) for s in numbers]
or with map:
numbers = map(lambda x: int(x) if x.isdigit() else float(x), numbers)
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