In Python, come posso convertire tutti gli elementi di un elenco in float?


246

Ho uno script che legge un file di testo, ne estrae i numeri decimali come stringhe e li inserisce in un elenco.

Quindi ho questo elenco:

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

Come posso convertire ciascuno dei valori nell'elenco da una stringa a un float?

Ho provato:

for item in list:
    float(item)

Ma questo non sembra funzionare per me.


61
Non utilizzare l'elenco come nome di variabile.
Tim Pietzcker,

4
Per approfondire il commento di cui sopra: l'utilizzo listcome nome variabile list
oscurerà il

Risposte:


452
[float(i) for i in lst]

per essere precisi, crea un nuovo elenco con valori float. A differenza mapdell'approccio funzionerà in py3k.


7
Per le grandi di matrice, mi consiglia di utilizzare NumPy: np.array(inp_list, dtype=np.float32). Non è nemmeno necessario specificare se è un float e basta usare:np.array(inp_list)
Thomas Devoogdt

2
@Thomas Devoogdt: penso che tu debba specificare il tipo, altrimenti otterrai una serie di stringhe
intorpidita

2
Nota che devi assegnare [float(i) for i in lst]qualcosa. Ad esempio:new_list = [float(i) for i in lst]
FaizFizy,

126

map(float, mylist) dovrebbe farlo.

(In Python 3, la mappa smette di restituire un oggetto elenco, quindi se vuoi un nuovo elenco e non solo qualcosa su cui iterare, hai bisogno list(map(float, mylist)o oppure usa la risposta di SilentGhost che probabilmente è più pitonica.)


Questa è in effetti una
subottimalità del

15

float(item)fai la cosa giusta: converte il suo argomento in float e restituiscilo, ma non cambia l'argomento sul posto. Una semplice correzione per il tuo codice è:

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

Lo stesso codice può essere scritto più breve usando la comprensione dell'elenco: new_list = [float(i) for i in list]

Per modificare l'elenco sul posto:

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

A proposito, evita di usarlo listper le tue variabili, poiché maschera la funzione integrata con lo stesso nome.


Spiacenti, non ho capito cosa significhi sul posto qui. In cosa differisce dalla precedente risposta pitonica. La conversione nella risposta precedente "[float (i) for i in lst]" non mantiene l'indice dell'elenco originale
AAI

1
@AAI Modifica l'elenco originale anziché crearne uno nuovo.
Denis Otkidach,

13

Questo sarebbe un altro metodo (senza usare alcun loop!):

import numpy as np
list(np.float_(list_name))

Non è necessario eseguire nuovamente il cast di np.array nell'elenco se si desidera mantenerlo come np.array =)
alvas

8

puoi persino farlo numpy

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

questo restituisce l'array np del tuo elenco come float

puoi anche impostare 'dtype' come int


1
Ma poi stai restituendo un array intorpidito, non un elenco.
user650261

3

È possibile utilizzare numpy per convertire un elenco direttamente in una matrice o matrice mobile.

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

Se si desidera convertire l'array intero in un array mobile, aggiungere 0 ad esso

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

1

Ecco come lo farei.

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

che visualizza il tipo come un elenco di stringhe. Puoi convertire questo elenco in un array di float contemporaneamente usando 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

Ho dovuto estrarre prima i numeri da un elenco di stringhe float:

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

quindi ogni conversione in un float:

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

alla fine assegnare tutti i float a un frame di dati come float64:

   df4['fscore'] = np.array(ad,dtype=float)

0

Ho risolto questo problema nel mio programma usando:

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

1
L'OP afferma che sta leggendo da un file di testo. questa risposta non si applica a ciò che è stato chiesto.
Ilhicas,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.