Dengan Python, bagaimana cara mengubah semua item dalam daftar menjadi mengapung?

246

Saya memiliki skrip yang membaca file teks, menarik angka desimal dari itu sebagai string dan menempatkannya ke dalam daftar.

Jadi saya punya daftar ini:

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

Bagaimana cara mengubah setiap nilai dalam daftar dari string ke float?

Saya telah mencoba:

for item in list:
    float(item)

Tapi ini sepertinya tidak berhasil untukku.

Patrick Artner
sumber
61
Jangan gunakan daftar sebagai nama variabel.
Tim Pietzcker
4
Untuk menguraikan komentar di atas: menggunakan listsebagai nama variabel akan membayangi listkonstruktor
bawaan

Jawaban:

452
[float(i) for i in lst]

tepatnya, itu membuat daftar baru dengan nilai float. Berbeda dengan mappendekatan itu akan bekerja di py3k.

SilentGhost
sumber
7
Untuk array besar, saya akan merekomendasikan menggunakan numpy: np.array(inp_list, dtype=np.float32). Anda bahkan tidak perlu menentukan apakah itu pelampung dan hanya menggunakan:np.array(inp_list)
Thomas Devoogdt
2
@Thomas Devoogdt: Saya pikir Anda perlu menentukan jenisnya, jika tidak, Anda akan mendapatkan serangkaian string yang numpy
seb007
2
Harap dicatat bahwa Anda harus menetapkan [float(i) for i in lst]sesuatu. Misalnya:new_list = [float(i) for i in lst]
FaizFizy
126

map(float, mylist) harus melakukannya.

(Dalam Python 3, peta berhenti mengembalikan objek daftar, jadi jika Anda ingin daftar baru dan bukan hanya sesuatu untuk diulangi, Anda perlu list(map(float, mylist)- atau menggunakan jawaban SilentGhost yang bisa dibilang lebih pythonic.)

Tim Pietzcker
sumber
Ini sebenarnya sub-optimalitas desain di Python 3.
xuancong84
15

float(item)lakukan hal yang benar: ia mengubah argumennya menjadi mengambang dan mengembalikannya, tetapi itu tidak mengubah argumen di tempat. Perbaikan sederhana untuk kode Anda adalah:

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

Kode yang sama dapat ditulis lebih pendek menggunakan pemahaman daftar: new_list = [float(i) for i in list]

Untuk mengubah daftar di tempat:

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

BTW, hindari menggunakan listuntuk variabel Anda, karena menyamar fungsi built-in dengan nama yang sama.

Denis Otkidach
sumber
Maaf, saya tidak mengerti artinya di tempat. Bagaimana perbedaannya dari jawaban pythonic sebelumnya. Bukankah konversi dalam jawaban sebelumnya "[float (i) for i in lst]" mempertahankan indeks daftar asli
AAI
1
@AAI Ubah daftar asli vs. buat yang baru.
Denis Otkidach
13

Ini akan menjadi metode lain (tanpa menggunakan loop apa pun!):

import numpy as np
list(np.float_(list_name))
Amin Kiany
sumber
Tidak perlu memasukkan np.array ke dalam daftar lagi jika Anda ingin menyimpannya sebagai np.array =)
alvas
8

Anda bahkan dapat melakukan ini dengan numpy

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

ini mengembalikan np array daftar Anda sebagai float

Anda juga dapat mengatur 'dtype' sebagai int

Alireza
sumber
1
Tapi kemudian Anda mengembalikan array numpy, bukan daftar.
user650261
3

Anda dapat menggunakan numpy untuk mengonversi daftar langsung ke array atau matriks mengambang.

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

Jika Anda ingin mengonversi bilangan bulat bilangan ke larik mengambang, maka tambahkan 0. ke dalamnya

    list_float = np.array(list_ex) + 0. # This is a numpy floating array
bfree67
sumber
1

Inilah yang akan saya lakukan.

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

yang menampilkan jenis sebagai daftar string. Anda dapat mengonversi daftar ini menjadi array float secara bersamaan menggunakan numpy:

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

    print(type(my_list), type(my_list[0]))  
    # <class 'numpy.ndarray'> <class 'numpy.float64'>
Barry O'Sullivan
sumber
0

Saya harus mengekstraksi angka terlebih dahulu dari daftar string float:

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

lalu setiap konversi menjadi float:

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

pada akhirnya tetapkan semua float ke dataframe sebagai float64:

   df4['fscore'] = np.array(ad,dtype=float)
Max Kleiner
sumber
0

Saya telah memecahkan masalah ini dalam program saya menggunakan:

number_input = float("{:.1f}".format(float(input())))
list.append(number_input)
Gui
sumber
1
OP menyatakan bahwa ia membaca dari file teks. jawaban ini tidak berlaku untuk apa yang telah diminta.
Ilhicas
0
for i in range(len(list)): list[i]=float(list[i])
pengguna11545988
sumber