Jak w Pythonie przekonwertować wszystkie elementy z listy na zmiennoprzecinkowe?

246

Mam skrypt, który odczytuje plik tekstowy, wyciąga z niego liczby dziesiętne jako ciągi znaków i umieszcza je na liście.

Mam więc tę 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']

Jak przekonwertować każdą z wartości z listy z ciągu na zmiennoprzecinkowe?

Próbowałem:

for item in list:
    float(item)

Ale to chyba nie działa dla mnie.

Patrick Artner
źródło
61
Nie używaj listy jako nazwy zmiennej.
Tim Pietzcker
4
Aby rozwinąć powyższy komentarz: użycie listjako nazwy zmiennej spowoduje cień wbudowanego listkonstruktora, a tym samym nie pozwoli na użycie tego w tym samym zakresie
Lasse Halberg Haarbye

Odpowiedzi:

452
[float(i) for i in lst]

mówiąc dokładniej, tworzy nową listę z wartościami zmiennoprzecinkowymi. W przeciwieństwie do mappodejścia będzie działać w py3k.

SilentGhost
źródło
7
Dla dużych Array, polecam za pomocą numpy: np.array(inp_list, dtype=np.float32). Nie musisz nawet określać, czy jest to liczba zmiennoprzecinkowa, i po prostu użyj:np.array(inp_list)
Thomas Devoogdt
2
@Thomas Devoogdt: Myślę, że musisz określić typ, w przeciwnym razie otrzymasz tablicę liczb ciągów
liczbowych
2
Pamiętaj, że musisz [float(i) for i in lst]coś przypisać . Np .:new_list = [float(i) for i in lst]
FaizFizy
126

map(float, mylist) powinien to zrobić.

(W Pythonie 3 mapa przestaje zwracać obiekt listy, więc jeśli chcesz nowej listy, a nie tylko czegoś do iteracji, albo potrzebujesz list(map(float, mylist)- albo skorzystaj z odpowiedzi SilentGhost, która jest prawdopodobnie bardziej pythoniczna).

Tim Pietzcker
źródło
Jest to w rzeczywistości suboptymalność projektowania w Pythonie 3.
xuancong84,
15

float(item)postępuj właściwie: konwertuje argument na zmiennoprzecinkowy i zwraca go, ale nie zmienia argumentu na miejscu. Prosta poprawka dla twojego kodu to:

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

Ten sam kod można napisać krócej przy użyciu listy: new_list = [float(i) for i in list]

Aby zmienić listę w miejscu:

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

BTW, unikaj używania listzmiennych, ponieważ maskuje to wbudowaną funkcję o tej samej nazwie.

Denis Otkidach
źródło
Przepraszam, nie rozumiem, co to znaczy tutaj w miejscu. Czym różni się od poprzedniej pythonowej odpowiedzi. Czy konwersja w poprzedniej odpowiedzi „[float (i) for i in lst]” nie zachowuje indeksu oryginalnej listy
AAI
1
@AAI Zmień oryginalną listę vs. stwórz nową.
Denis Otkidach
13

To byłaby inna metoda (bez użycia żadnej pętli!):

import numpy as np
list(np.float_(list_name))
Amin Kiany
źródło
Nie musisz ponownie rzucać np.array na listę, jeśli chcesz zachować go jako np.array =)
alvas
8

możesz to zrobić nawet przez numpy

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

zwraca tablicę np z listy jako float

możesz również ustawić „dtype” jako int

Alireza
źródło
1
Ale wtedy zwracasz tablicę numpy, a nie listę.
user650261
3

Możesz użyć numpy do konwersji listy bezpośrednio na zmienną tablicę lub macierz.

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

Jeśli chcesz przekonwertować tablicę liczb całkowitych na tablicę pływającą, dodaj do niej 0.

    list_float = np.array(list_ex) + 0. # This is a numpy floating array
bfree67
źródło
1

Tak bym to zrobił.

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
źródło
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'>

który wyświetla typ jako listę ciągów. Możesz przekonwertować tę listę na tablicę pływaków jednocześnie, używając 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
źródło
0

Musiałem najpierw wyodrębnić liczby z listy ciągów pływających:

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

następnie każda konwersja na liczbę zmiennoprzecinkową:

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

na koniec przypisz wszystkie zmiennoprzecinkowe do ramki danych jako float64:

   df4['fscore'] = np.array(ad,dtype=float)
Max Kleiner
źródło
0

Rozwiązałem ten problem w moim programie, używając:

number_input = float("{:.1f}".format(float(input())))
list.append(number_input)
Gui
źródło
1
OP stwierdza, że ​​czyta z pliku tekstowego. ta odpowiedź nie dotyczy tego, o co pytano.
Ilhicas,
0
for i in range(len(list)): list[i]=float(list[i])
użytkownik11545988
źródło