Як в 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]

якщо бути точним, він створює новий список із значеннями float. На відміну від mapпідходу, він буде працювати в py3k.


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 карта перестає повертати об’єкт списку, тому якщо ви хочете новий список, а не просто щось, щоб повторити, вам або потрібно list(map(float, mylist)- або скористайтеся відповіддю SilentGhost, який, мабуть, є більш пітонічним.)


Це насправді дизайн-неоптимальність у Python 3.
xuancong84

15

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

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)

BTW, уникайте використання 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

ви навіть можете це зробити нумером

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

цей масив повернення np вашого списку як плаваючий

ви також можете встановити 'dtype' як int


1
Але тоді ви повертаєте нумерований масив, а не список.
користувач650261

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

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

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
В ОП зазначається, що він читає з текстового файлу. ця відповідь не поширюється на запитання.
Ілхікас

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.