En Python, comment convertir tous les éléments d'une liste en flottants?

246

J'ai un script qui lit un fichier texte, en extrait des nombres décimaux sous forme de chaînes et les place dans une liste.

J'ai donc cette liste:

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

Comment convertir chacune des valeurs de la liste d'une chaîne en un flottant?

J'ai essayé:

for item in list:
    float(item)

Mais cela ne semble pas fonctionner pour moi.

Patrick Artner
la source
61
N'utilisez pas list comme nom de variable.
Tim Pietzcker
4
Pour développer le commentaire ci-dessus: l'utilisation en listtant que nom de variable masquera le constructeur intégré listet ne vous permettra donc pas de l'utiliser dans la même portée
Lasse Halberg Haarbye

Réponses:

452
[float(i) for i in lst]

pour être précis, il crée une nouvelle liste avec des valeurs flottantes. Contrairement à l' mapapproche, cela fonctionnera dans py3k.

SilentGhost
la source
7
Pour grands du tableau, je vous conseille d' utiliser numpy: np.array(inp_list, dtype=np.float32). Vous n'avez même pas besoin de spécifier si c'est un flotteur et utilisez simplement:np.array(inp_list)
Thomas Devoogdt
2
@Thomas Devoogdt: Je pense que vous devez spécifier le type, sinon vous obtiendrez un tableau numpy de chaînes
seb007
2
Veuillez noter que vous devez attribuer [float(i) for i in lst]à quelque chose. Par exemple:new_list = [float(i) for i in lst]
FaizFizy
126

map(float, mylist) devrait le faire.

(Dans Python 3, la carte cesse de renvoyer un objet liste, donc si vous voulez une nouvelle liste et pas seulement quelque chose à répéter, vous avez besoin list(map(float, mylist)- ou utilisez la réponse de SilentGhost qui est sans doute plus pythonique.)

Tim Pietzcker
la source
Il s'agit en fait d'une sous-optimalité de conception dans Python 3.
xuancong84
15

float(item)faites la bonne chose: il convertit son argument en flottant et le renvoie, mais il ne change pas d'argument en place. Une solution simple pour votre code est:

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

Le même code peut être écrit plus court en utilisant la compréhension de liste: new_list = [float(i) for i in list]

Pour modifier la liste sur place:

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

BTW, évitez d'utiliser listpour vos variables, car il masque la fonction intégrée avec le même nom.

Denis Otkidach
la source
Désolé, je n'ai pas compris ce que cela signifie ici. En quoi diffère-t-il de la réponse pythonique précédente. La conversion dans la réponse précédente "[float (i) for i in lst]" ne conserve-t-elle pas l'index de liste d'origine
AAI
1
@AAI Modifier la liste d'origine par rapport à en créer une nouvelle.
Denis Otkidach
13

Ce serait une autre méthode (sans utiliser de boucle!):

import numpy as np
list(np.float_(list_name))
Amin Kiany
la source
Vous n'avez pas besoin de lancer à nouveau le np.array dans la liste si vous souhaitez le conserver en tant que np.array =)
alvas
8

vous pouvez même le faire par numpy

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

ce tableau np de retour de votre liste comme float

vous pouvez également définir 'dtype' comme int

Alireza
la source
1
Mais alors vous retournez un tableau numpy, pas une liste.
user650261
3

Vous pouvez utiliser numpy pour convertir une liste directement en tableau ou matrice flottante.

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

Si vous souhaitez convertir le tableau entier en un tableau flottant, ajoutez-y 0.

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

Voilà comment je le ferais.

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

qui affiche le type sous forme de liste de chaînes. Vous pouvez convertir cette liste en un tableau de flottants simultanément en utilisant 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
la source
0

J'ai d'abord dû extraire des nombres d'une liste de chaînes flottantes:

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

puis chacun convertit en un flotteur:

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

à la fin, affectez tous les flottants à une trame de données en tant que float64:

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

J'ai résolu ce problème dans mon programme en utilisant:

number_input = float("{:.1f}".format(float(input())))
list.append(number_input)
Gui
la source
1
L'OP déclare qu'il lit un fichier texte. cette réponse ne s'applique pas à ce qui a été demandé.
Ilhicas
0
for i in range(len(list)): list[i]=float(list[i])
user11545988
la source