En Python, ¿cómo convierto todos los elementos de una lista en flotantes?

246

Tengo un script que lee un archivo de texto, extrae números decimales como cadenas y los coloca en una lista.

Entonces tengo esta lista:

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

¿Cómo convierto cada uno de los valores de la lista de una cadena a un flotante?

Yo he tratado:

for item in list:
    float(item)

Pero esto no parece funcionar para mí.

Patrick Artner
fuente
6060
No use la lista como nombre de variable.
Tim Pietzcker
44
Para elaborar el comentario anterior: el uso listcomo nombre de variable sombreará el constructor incorporado y, por lo listtanto, no le permitirá usar eso en el mismo alcance
Lasse Halberg Haarbye

Respuestas:

452
[float(i) for i in lst]

Para ser precisos, crea una nueva lista con valores flotantes. A diferencia del mapenfoque, funcionará en py3k.

SilentGhost
fuente
77
Para grandes de la matriz, yo recomendaría usar numpy: np.array(inp_list, dtype=np.float32). Ni siquiera tiene que especificar si es un flotador y simplemente usar:np.array(inp_list)
Thomas Devoogdt
2
@Thomas Devoogdt: Creo que necesita especificar el tipo, de lo contrario obtendrá una gran variedad de cadenas
seb007
2
Tenga en cuenta que debe asignar [float(i) for i in lst]algo. Por ejemplo:new_list = [float(i) for i in lst]
FaizFizy
126

map(float, mylist) Deberías hacerlo.

(En Python 3, el mapa deja de devolver un objeto de lista, por lo que si desea una nueva lista y no solo algo para iterar, necesita list(map(float, mylist)o usa la respuesta de SilentGhost, que posiblemente sea más pitónica).

Tim Pietzcker
fuente
De hecho, esta es una
suboptimidad de
15

float(item)haga lo correcto: convierte su argumento en flotante y lo devuelve, pero no cambia el argumento en el lugar. Una solución simple para su código es:

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

El mismo código puede escribirse más corto usando la comprensión de la lista: new_list = [float(i) for i in list]

Para cambiar la lista en el lugar:

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

Por cierto, evite usar listpara sus variables, ya que enmascara la función incorporada con el mismo nombre.

Denis Otkidach
fuente
Lo siento, no entendí lo que significa en el lugar aquí. ¿Cómo difiere de la respuesta pitónica anterior? ¿La conversión en la respuesta anterior "[float (i) para i en lst]" no conserva el índice de la lista original
AAI
1
@AAI Cambiar la lista original en lugar de crear una nueva.
Denis Otkidach
13

Este sería el otro método (¡sin usar ningún bucle!):

import numpy as np
list(np.float_(list_name))
Amin Kiany
fuente
No es necesario volver a colocar el np.array en la lista si desea mantenerlo como np.array =)
alvas
8

incluso puedes hacer esto por numpy

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

esta matriz de retorno np de su lista como flotante

También puede establecer 'dtype' como int

Alireza
fuente
1
Pero luego está devolviendo una matriz numpy, no una lista.
user650261
3

Puede usar numpy para convertir una lista directamente en una matriz o matriz flotante.

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

Si desea convertir la matriz entera en una matriz flotante, agregue 0.

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

Así es como lo haría.

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

que muestra el tipo como una lista de cadenas. Puede convertir esta lista en una matriz de flotantes simultáneamente 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'>
Barry O'Sullivan
fuente
0

Primero tuve que extraer números de una lista de cadenas flotantes:

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

entonces cada uno se convierte en un flotador:

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

Al final, asigne todos los flotadores a un marco de datos como float64:

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

He resuelto este problema en mi programa usando:

number_input = float("{:.1f}".format(float(input())))
list.append(number_input)
Gui
fuente
1
El OP afirma que está leyendo un archivo de texto. Esta respuesta no se aplica a lo que se ha pedido.
Ilhicas
0
for i in range(len(list)): list[i]=float(list[i])
usuario11545988
fuente