ใน Python ฉันจะแปลงรายการทั้งหมดในรายการให้เป็นแบบลอยได้อย่างไร


246

ฉันมีสคริปต์ที่อ่านไฟล์ข้อความดึงตัวเลขทศนิยมออกมาเป็นสตริงและวางลงในรายการ

ดังนั้นฉันมีรายการนี้:

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

ฉันจะแปลงค่าแต่ละค่าในรายการจากสตริงเป็นทศนิยมได้อย่างไร

ฉันเหนื่อย:

for item in list:
    float(item)

แต่นี่ดูเหมือนจะไม่ได้ผลสำหรับฉัน


61
อย่าใช้รายการเป็นชื่อตัวแปร
ทิม Pietzcker

4
หากต้องการอธิบายอย่างละเอียดเกี่ยวกับความคิดเห็นด้านบน: การใช้listเป็นชื่อตัวแปรจะlistทำให้คอนสตรัคเตอร์ในตัวไม่สามารถใช้งานในขอบเขตเดียวกันได้
Lasse Halberg Haarbye

คำตอบ:


452
[float(i) for i in lst]

จะแม่นยำสร้างรายการใหม่ที่มีค่าลอย ซึ่งแตกต่างจากmapวิธีการที่จะทำงานใน py3k


7
สำหรับ array ขนาดใหญ่เป็นผมจะแนะนำให้ใช้ np.array(inp_list, dtype=np.float32)numpy: คุณไม่จำเป็นต้องระบุว่ามันเป็นแบบลอยหรือnp.array(inp_list)
เปล่า

2
@Thomas Devoogdt: ฉันคิดว่าคุณจำเป็นต้องระบุประเภทมิฉะนั้นคุณจะได้รับสตริงจำนวน numpy
seb007

2
โปรดทราบว่าคุณต้องกำหนดให้[float(i) for i in lst]กับบางสิ่ง เช่น:new_list = [float(i) for i in lst]
FaizFizy

126

map(float, mylist) ควรทำมัน

(ใน Python 3 แผนที่จะสิ้นสุดการส่งคืนวัตถุรายการดังนั้นถ้าคุณต้องการรายการใหม่และไม่ใช่แค่การทำซ้ำคุณต้องlist(map(float, mylist)หรือใช้คำตอบของ SilentGhost ซึ่งเป็นไพ ธ อนมากกว่า)


นี่คือความจริงแล้ว sub-optimality การออกแบบใน Python 3
xuancong84

15

float(item)ทำสิ่งที่ถูกต้อง: มันแปลงอาร์กิวเมนต์เพื่อลอยและส่งคืน แต่ไม่เปลี่ยนอาร์กิวเมนต์ในตำแหน่ง การแก้ไขง่ายๆสำหรับรหัสของคุณคือ:

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

รหัสเดียวกันสามารถเขียนให้สั้นลงได้โดยใช้ list comprehension: new_list = [float(i) for i in list]

ในการเปลี่ยนรายการแบบประจำ:

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

BTW หลีกเลี่ยงการใช้listสำหรับตัวแปรของคุณเนื่องจากมันจะปลอมแปลงฟังก์ชันในตัวที่มีชื่อเดียวกัน


ขออภัยฉันไม่ได้รับสิ่งที่หมายถึงที่นี่ มันแตกต่างจากคำตอบ pythonic ก่อนหน้าอย่างไร การแปลงในคำตอบก่อนหน้านี้ไม่ใช่ "[float (i) สำหรับ i ใน lst]" เก็บดัชนีรายการดั้งเดิม
AAI

1
@AAI เปลี่ยนรายการดั้งเดิมเทียบกับสร้างรายการใหม่
Denis Otkidach

13

นี่จะเป็นวิธีอื่น (โดยไม่ต้องใช้การวนซ้ำใด ๆ !):

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

ไม่จำเป็นต้องโยน np.array ลงในรายการอีกครั้งหากคุณต้องการเก็บไว้เป็น np.array =)
alvas

8

คุณสามารถทำสิ่งนี้ได้ด้วย numpy

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

อาร์เรย์ np ที่ส่งคืนของรายการของคุณเป็นแบบลอย

คุณยังสามารถตั้งค่า 'dtype' เป็น int


1
แต่คุณจะคืนค่าอาร์เรย์ที่ไม่ใช่ numpy
user650261

3

คุณสามารถใช้ numpy เพื่อแปลงรายการโดยตรงไปยังอาร์เรย์ลอยหรือเมทริกซ์

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

หากคุณต้องการแปลงอาร์เรย์จำนวนเต็มเป็นอาร์เรย์ลอยตัวให้เพิ่ม 0 เข้ากับอาร์เรย์

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

1

นี่คือวิธีที่ฉันจะทำมัน

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

ซึ่งแสดงประเภทเป็นรายการสตริง คุณสามารถแปลงรายการนี้เป็นอาร์เรย์ลอยพร้อมกันโดยใช้ 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

ฉันต้องแยกตัวเลขออกจากรายการสตริงการลอย:

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

จากนั้นแต่ละแปลงเป็นลอย:

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

ในตอนท้ายกำหนดลอยทั้งหมดให้กับ dataframe เป็น float64:

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

0

ฉันได้แก้ปัญหานี้ในโปรแกรมของฉันโดยใช้:

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

1
OP ระบุว่าเขากำลังอ่านจากไฟล์ข้อความ คำตอบนี้ใช้ไม่ได้กับสิ่งที่ถูกถาม
Ilhicas

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.