Wie konvertiere ich in Python alle Elemente in einer Liste in Floats?


246

Ich habe ein Skript, das eine Textdatei liest, Dezimalzahlen als Zeichenfolgen herauszieht und sie in eine Liste einfügt.

Also habe ich diese 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']

Wie konvertiere ich jeden der Werte in der Liste von einem String in einen Float?

Ich habe versucht:

for item in list:
    float(item)

Aber das scheint bei mir nicht zu funktionieren.


60
Verwenden Sie list nicht als Variablennamen.
Tim Pietzcker

4
Um den obigen Kommentar näher zu erläutern: Wenn Sie ihn listals Variablennamen verwenden, wird der integrierte listKonstruktor beschattet, sodass Sie ihn nicht im selben Bereich verwenden können
Lasse Halberg Haarbye,

Antworten:


452
[float(i) for i in lst]

Um genau zu sein, wird eine neue Liste mit Gleitkommawerten erstellt. Im Gegensatz zum mapAnsatz funktioniert es in py3k.


7
Für große Arrays würde ich die Verwendung von numpy empfehlen : np.array(inp_list, dtype=np.float32). Sie müssen nicht einmal angeben, ob es sich um einen Float handelt, und nur np.array(inp_list)
Folgendes

2
@ Thomas Devoogdt: Ich denke, Sie müssen den Typ angeben, sonst erhalten Sie eine Reihe von Zeichenfolgen
seb007

2
Bitte beachten Sie, dass Sie [float(i) for i in lst]etwas zuweisen müssen. ZB:new_list = [float(i) for i in lst]
FaizFizy

126

map(float, mylist) Sollte es tun.

(In Python 3 gibt map kein list(map(float, mylist)Listenobjekt mehr zurück. Wenn Sie also eine neue Liste und nicht nur etwas zum Durchlaufen wünschen , müssen Sie entweder die Antwort von SilentGhost verwenden - oder verwenden, die wohl pythonischer ist.)


Dies ist in der Tat eine Design-
Suboptimalität

15

float(item)Tun Sie das Richtige: Es konvertiert sein Argument in float und gibt es zurück, ändert aber das Argument nicht an Ort und Stelle. Eine einfache Lösung für Ihren Code ist:

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

Der gleiche Code kann mit Listenverständnis kürzer geschrieben werden: new_list = [float(i) for i in list]

So ändern Sie die Liste an Ort und Stelle:

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

Übrigens, vermeiden Sie die Verwendung listfür Ihre Variablen, da diese die integrierte Funktion mit demselben Namen maskieren.


Entschuldigung, ich habe nicht verstanden, was In-Place hier bedeutet. Wie unterscheidet es sich von der vorherigen pythonischen Antwort? Behält die Konvertierung in der vorherigen Antwort "[float (i) für i in lst]" nicht den ursprünglichen Listenindex bei
AAI

1
@AAI Ursprüngliche Liste ändern vs. neue erstellen.
Denis Otkidach

13

Dies wäre eine andere Methode (ohne Verwendung einer Schleife!):

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

Sie müssen das np.array nicht erneut in die Liste aufnehmen, wenn Sie es als np.array behalten möchten =)
alvas

8

Sie können dies sogar durch Numpy tun

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

Dies gibt das np-Array Ihrer Liste als float zurück

Sie können 'dtype' auch als int festlegen


1
Aber dann geben Sie ein numpy-Array zurück, keine Liste.
user650261

3

Mit numpy können Sie eine Liste direkt in ein schwebendes Array oder eine Matrix konvertieren.

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

Wenn Sie das Integer-Array in ein Floating-Array konvertieren möchten, fügen Sie 0 hinzu

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

1

So würde ich es machen.

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

Hier wird der Typ als Liste von Zeichenfolgen angezeigt. Sie können diese Liste mit numpy gleichzeitig in ein Array von Floats konvertieren:

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

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

0

Ich musste zuerst Zahlen aus einer Liste von Float-Strings extrahieren:

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

dann jeweils in einen float umwandeln:

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

Weisen Sie am Ende alle Floats einem Datenrahmen als float64 zu:

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

0

Ich habe dieses Problem in meinem Programm gelöst mit:

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

1
Das OP gibt an, dass er aus einer Textdatei liest. Diese Antwort gilt nicht für das, was gefragt wurde.
Ilhicas

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.