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.


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.


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.)


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.


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

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


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

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

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

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)

0

Saya telah memecahkan masalah ini dalam program saya menggunakan:

number_input = float("{:.1f}".format(float(input())))
list.append(number_input)

1
OP menyatakan bahwa ia membaca dari file teks. jawaban ini tidak berlaku untuk apa yang telah diminta.
Ilhicas

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.