В Python, как мне преобразовать все элементы в списке в плавающие?

246

У меня есть скрипт, который читает текстовый файл, извлекает из него десятичные числа в виде строк и помещает их в список.

Итак, у меня есть этот список:

['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']

Как преобразовать каждое из значений в списке из строки в число с плавающей точкой?

Я пытался:

for item in list:
    float(item)

Но это не похоже на работу для меня.

Патрик Артнер
источник
61
Не используйте список в качестве имени переменной.
Тим Пицкер
4
Чтобы уточнить этот комментарий: использование listв качестве имени переменной list
затеняет

Ответы:

452
[float(i) for i in lst]

точнее, он создает новый список со значениями с плавающей точкой. В отличие от mapподхода он будет работать в py3k.

SilentGhost
источник
7
Для больших массивов, я бы рекомендовал использовать NumPy: np.array(inp_list, dtype=np.float32). Вам даже не нужно указывать, является ли это поплавком, и просто использовать:np.array(inp_list)
Thomas Devoogdt
2
@Thomas Devoogdt: я думаю, что вам нужно указать тип, иначе вы получите простой массив строк
seb007
2
Обратите внимание, что вы должны назначить [float(i) for i in lst]что-то. Например:new_list = [float(i) for i in lst]
FaizFizy
126

map(float, mylist) должен сделать это.

(В Python 3 map перестает возвращать объект списка, поэтому, если вы хотите создать новый список, а не просто что-то перебирать, вам нужно list(map(float, mylist)либо использовать ответ SilentGhost, который, возможно, является более питоническим.)

Тим Питцкер
источник
Это на самом деле
неоптимальность
15

float(item)сделать правильную вещь: он преобразует свой аргумент в float и и возвращает его, но он не меняет аргумент на месте. Простое исправление для вашего кода:

new_list = []
for item in list:
    new_list.append(float(item))

Тот же код может быть написан короче, используя понимание списка: new_list = [float(i) for i in list]

Чтобы изменить список на месте:

for index, item in enumerate(list):
    list[index] = float(item)

Кстати, избегайте использования listдля ваших переменных, поскольку он маскирует встроенную функцию с тем же именем.

Денис Откидач
источник
Извините, я не понял, что означает на месте. Чем он отличается от предыдущего питонического ответа. Не сохраняет ли преобразование в предыдущем ответе «[float (i) for i in lst]» исходный индекс списка
AAI
1
@AAI Измените первоначальный список и создайте новый.
Денис Откидач
13

Это будет другой метод (без использования цикла!):

import numpy as np
list(np.float_(list_name))
Амин Кианы
источник
Не нужно снова приводить np.array в список, если вы хотите сохранить его как np.array =)
alvas
8

Вы даже можете сделать это с помощью NumPy

import numpy as np
np.array(your_list,dtype=float)

это возвращает массив np вашего списка как float

Вы также можете установить «тип» как INT

Алиреза
источник
1
Но тогда вы возвращаете пустой массив, а не список.
user650261
3

Вы можете использовать numpy для преобразования списка непосредственно в плавающий массив или матрицу.

    import numpy as np
    list_ex = [1, 0] # This a list
    list_int = np.array(list_ex) # This is a numpy integer array

Если вы хотите преобразовать целочисленный массив в плавающий массив, добавьте к нему 0.

    list_float = np.array(list_ex) + 0. # This is a numpy floating array
bfree67
источник
1

Вот как бы я это сделал.

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'>
SammyRod
источник
0
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'>

который отображает тип в виде списка строк. Вы можете преобразовать этот список в массив с плавающей точкой одновременно, используя numpy:

    my_list = np.array(my_list).astype(np.float)

    print(type(my_list), type(my_list[0]))  
    # <class 'numpy.ndarray'> <class 'numpy.float64'>
Барри О'Салливан
источник
0

Сначала мне пришлось извлечь числа из списка строк с плавающей запятой:

   df4['sscore'] = df4['simscore'].str.findall('\d+\.\d+')

затем каждый конвертируется в число с плавающей точкой:

   ad=[]
   for z in range(len(df4)):
      ad.append([float(i) for i in df4['sscore'][z]])

в конце присвойте все плавающие данные фрейму данных как float64:

   df4['fscore'] = np.array(ad,dtype=float)
Макс Кляйнер
источник
0

Я решил эту проблему в моей программе, используя:

number_input = float("{:.1f}".format(float(input())))
list.append(number_input)
графический интерфейс пользователя
источник
1
ОП утверждает, что он читает из текстового файла. этот ответ не относится к тому, что было задано.
Ilhicas
0
for i in range(len(list)): list[i]=float(list[i])
user11545988
источник