Trong Python, làm cách nào để chuyển đổi tất cả các mục trong danh sách thành float?


246

Tôi có một đoạn script đọc tệp văn bản, kéo các số thập phân ra khỏi nó dưới dạng chuỗi và đặt chúng vào danh sách.

Vì vậy, tôi có danh sách này:

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

Làm cách nào để chuyển đổi từng giá trị trong danh sách từ chuỗi sang float?

Tôi đã thử:

for item in list:
    float(item)

Nhưng điều này dường như không làm việc cho tôi.


60
Đừng sử dụng danh sách làm tên biến.
Tim Pietzcker

4
Để giải thích về nhận xét trên: sử dụng listlàm tên biến sẽ phủ bóng lên hàm tạo tích hợp, listdo đó không cho phép bạn sử dụng tên đó trong cùng phạm vi
Lasse Halberg Haarbye

Câu trả lời:


452
[float(i) for i in lst]

chính xác hơn, nó tạo ra một danh sách mới với các giá trị float. Không giống như mapcách tiếp cận, nó sẽ hoạt động trong py3k.


7
Đối với mảng lớn, tôi khuyên bạn nên sử dụng numpy : np.array(inp_list, dtype=np.float32). Bạn thậm chí không phải chỉ định nếu đó là một float và chỉ cần sử dụng:np.array(inp_list)
Thomas Devoogdt

2
@Thomas Devoogdt: Tôi nghĩ rằng bạn cần phải chỉ định loại, nếu không, bạn sẽ nhận được một chuỗi các chuỗi khó khăn
seb007

2
Xin lưu ý rằng bạn phải gán [float(i) for i in lst]cho một cái gì đó. Ví dụ:new_list = [float(i) for i in lst]
FaizFizy

126

map(float, mylist) Hãy làm nó.

(Trong Python 3, bản đồ không còn trả về một đối tượng danh sách, vì vậy nếu bạn muốn có một danh sách mới và không chỉ một cái gì đó để lặp kết thúc, bạn có nhu cầu list(map(float, mylist)- hoặc sử dụng câu trả lời SilentGhost của được cho rằng là pythonic hơn.)


Thực tế đây là một sự tối ưu hóa thiết kế trong Python 3.
xuancong84

15

float(item)làm điều đúng: nó chuyển đổi đối số của nó thành float và trả về nó, nhưng nó không thay đổi đối số tại chỗ. Một sửa chữa đơn giản cho mã của bạn là:

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

Các mã tương tự có thể được viết ngắn hơn bằng cách sử dụng hiểu danh sách: new_list = [float(i) for i in list]

Để thay đổi danh sách tại chỗ:

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

BTW, tránh sử dụng listcho các biến của bạn, vì nó giả mạo chức năng tích hợp có cùng tên.


Xin lỗi, tôi không hiểu ý nghĩa tại chỗ ở đây. Làm thế nào nó khác với câu trả lời pythonic trước đó. Không phải chuyển đổi trong câu trả lời trước "[float (i) for i in lst]" giữ lại chỉ mục danh sách ban đầu
AAI

1
@AAI Thay đổi danh sách ban đầu so với tạo danh sách mới.
Denis Otkidach

13

Đây sẽ là một phương thức khác (không sử dụng bất kỳ vòng lặp nào!):

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

Không cần phải đưa np.array vào danh sách một lần nữa nếu bạn muốn giữ nó dưới dạng np.array =)
alvas

8

bạn thậm chí có thể làm điều này bằng cách numpy

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

mảng np này trả về danh sách của bạn dưới dạng float

bạn cũng có thể đặt 'dtype' là int


1
Nhưng sau đó, bạn đang trả về một mảng numpy, không phải là một danh sách.
dùng650261

3

Bạn có thể sử dụng numpy để chuyển đổi một danh sách trực tiếp thành một mảng hoặc ma trận nổi.

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

Nếu bạn muốn chuyển đổi mảng số nguyên thành mảng nổi thì thêm 0. vào nó

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

1

Đây là cách tôi sẽ làm điều đó.

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

Hiển thị kiểu dưới dạng danh sách các chuỗi. Bạn có thể chuyển đổi danh sách này thành một mảng các float đồng thời bằng cách sử dụng 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

Tôi đã phải trích xuất số đầu tiên từ một danh sách các chuỗi float:

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

sau đó mỗi chuyển đổi thành một float:

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

cuối cùng, gán tất cả các float cho một dataframe là float64:

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

0

Tôi đã giải quyết vấn đề này trong chương trình của mình bằng cách sử dụng:

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

1
OP nói rằng anh ta đang đọc từ một tệp văn bản. câu trả lời này không áp dụng cho những gì đã được hỏi.
Ilhicas

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.