I have a script which reads a text file, pulls decimal numbers out of it as strings and places them into a list.
So I have this list:
my_list = ['0.49', '0.54', '0.54', '0.55', '0.55', '0.54', '0.55', '0.55', '0.54']
How do I convert each of the values in the list from a string to a float?
I have tried:
for item in my_list:
float(item)
But this doesn't seem to work for me.
[float(i) for i in lst]
to be precise, it creates a new list with float values. Unlike the map
approach it will work in py3k.
map(float, mylist)
should do it.
(In Python 3, map ceases to return a list object, so if you want a new list and not just something to iterate over, you either need list(map(float, mylist)
- or use SilentGhost's answer which arguably is more pythonic.)
This would be an other method (without using any loop!):
import numpy as np
list(np.float_(list_name))
float(item)
do the right thing: it converts its argument to float and and return it, but it doesn't change argument in-place. A simple fix for your code is:
new_list = []
for item in list:
new_list.append(float(item))
The same code can written shorter using list comprehension: new_list = [float(i) for i in list]
To change list in-place:
for index, item in enumerate(list):
list[index] = float(item)
BTW, avoid using list
for your variables, since it masquerades built-in function with the same name.
you can even do this by numpy
import numpy as np
np.array(your_list,dtype=float)
this return np array of your list as float
you also can set 'dtype' as int
You can use numpy to convert a list directly to a floating array or matrix.
import numpy as np
list_ex = [1, 0] # This a list
list_int = np.array(list_ex) # This is a numpy integer array
If you want to convert the integer array to a floating array then add 0. to it
list_float = np.array(list_ex) + 0. # This is a numpy floating array
您可以使用map()
函数将列表直接转换为floats
:
float_list = map(float, list)
you can use numpy to avoid looping:
import numpy as np
list(np.array(my_list).astype(float)
This is how I would do it.
my_list = ['0.49', '0.54', '0.54', '0.54', '0.54', '0.54', '0.55', '0.54',
'0.54', '0.54', '0.55', '0.55', '0.55', '0.54', '0.55', '0.55', '0.54',
'0.55', '0.55', '0.54']
print type(my_list[0]) # prints <type 'str'>
my_list = [float(i) for i in my_list]
print type(my_list[0]) # prints <type 'float'>
import numpy as np
my_list = ['0.49', '0.54', '0.54', '0.54', '0.54', '0.54', '0.55', '0.54', '0.54', '0.54', '0.55', '0.55', '0.55', '0.54', '0.55', '0.55', '0.54',
'0.55', '0.55', '0.54']
print(type(my_list), type(my_list[0]))
# <class 'list'> <class 'str'>
which displays the type as a list of strings. You can convert this list to an array of floats simultaneously using numpy:
my_list = np.array(my_list).astype(np.float)
print(type(my_list), type(my_list[0]))
# <class 'numpy.ndarray'> <class 'numpy.float64'>
I have solve this problem in my program using:
number_input = float("{:.1f}".format(float(input())))
list.append(number_input)
I had to extract numbers first from a list of float strings:
df4['sscore'] = df4['simscore'].str.findall('\d+\.\d+')
then each convert to a float:
ad=[]
for z in range(len(df4)):
ad.append([float(i) for i in df4['sscore'][z]])
in the end assign all floats to a dataframe as float64:
df4['fscore'] = np.array(ad,dtype=float)
for i in range(len(list)): list[i]=float(list[i])
More than an answer, this shows that always the first one you find is not necessarily the best. Tim Pietzcker answer is the best and more efficient.
import time
from typing import Iterable
def timer(func, *args, reps=1000, **kwargs):
start = time.perf_counter()
for i in range(reps):
ret = func(*args, **kwargs)
lapse = time.perf_counter() - start
return lapse, ret
def listComprehension(to, list2comp: Iterable):
return list(to(i) for i in list2comp)
def mapping(to, list2map: Iterable):
return list(map(to, list2map))
if __name__ == '__main__':
list2convert = ['1', '2', '3', '4']
for func in mapping, list_comp:
lapse, ret = timer(func, float, list2convert)
print(func.__name__ + ': \n\tlapse:' + str(lapse) + '\n\tret:' + str(ret))
Results:
mapping:
lapse:0.005934100000000164
ret:[1.0, 2.0, 3.0, 4.0]
list_comp:
lapse:0.05731120000000001
ret:[1.0, 2.0, 3.0, 4.0]
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.