Python'da bir listedeki tüm öğeleri yüzer hale nasıl getirebilirim?


246

Bir metin dosyasını okur, dizeleri olarak ondalık sayıları çeker ve bir listeye yerleştirir bir komut dosyası var.

Yani bu liste var:

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

Listedeki değerlerin her birini bir dizeden kayan noktaya nasıl dönüştürebilirim?

Denedim:

for item in list:
    float(item)

Ama bu benim için işe yaramıyor.


61
Listeyi değişken adı olarak kullanmayın.
Tim Pietzcker

4
Yukarıdaki yoruma ayrıntılı olarak bakmak için: listdeğişken bir ad olarak kullanmak yerleşik list
yapıcıyı gölgeleyecek

Yanıtlar:


452
[float(i) for i in lst]

kesin olmak gerekirse, kayan noktalı değerlerle yeni bir liste oluşturur. mapYaklaşımdan farklı olarak py3k'de çalışacaktır.


7
Büyük dizi için, numpy: tavsiye ederim np.array(inp_list, dtype=np.float32). Bir şamandıra olup olmadığını belirtmeniz ve sadece kullanmanız np.array(inp_list)
gerekmiyor

2
@Thomas Devoogdt: Sanırım türü belirtmeniz gerekiyor, aksi takdirde çok çeşitli dizeler elde
edeceksiniz

2
Bir [float(i) for i in lst]şeye atamanız gerektiğini lütfen unutmayın . Örn:new_list = [float(i) for i in lst]
FaizFizy

126

map(float, mylist) yapmalı.

(Python 3'te, harita bir liste nesnesini döndürmekten list(map(float, mylist)vazgeçer , bu nedenle sadece yinelenecek bir şey değil, yeni bir liste istiyorsanız, ya ihtiyacınız vardır - ya da tartışmalı olarak daha pythonic olan SilentGhost'un yanıtını kullanın.)


Bu aslında Python 3'te bir tasarım alt
optimizasyonu

15

float(item)doğru olanı yapın: argümanını süzülüp geri döndürür, ancak argümanı yerinde değiştirmez. Kodunuz için basit bir düzeltme:

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

Aynı kod, liste kavrayışı kullanılarak daha kısa yazılabilir: new_list = [float(i) for i in list]

Listeyi yerinde değiştirmek için:

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

BTW, listdeğişkenler için kullanmaktan kaçının , çünkü aynı adı taşıyan yerleşik işlevi maskeler.


Maalesef, burada ne anlama geldiğini anlamadım. Önceki pitonik cevaptan farkı nedir? Bir önceki yanıttaki "float (i) lst için i") orijinal liste dizinini
AAI

1
@AAI Orijinal listeyi değiştirin ve yenisini oluşturun.
Denis Otkidach

13

Bu başka bir yöntem olacaktır (herhangi bir döngü kullanmadan!):

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

Eğer np.array =) olarak tutmak isterseniz np.array'ı tekrar listeye dökmenize gerek yok
alvas

8

bunu numpy ile bile yapabilirsiniz

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

listenizdeki bu np dizisini kayan nokta olarak döndürür

'dtype' öğesini int olarak da ayarlayabilirsiniz


1
Ama sonra bir liste değil, numpy bir dizi döndürüyorsunuz.
user650261

3

Bir listeyi doğrudan kayan bir diziye veya matrise dönüştürmek için numpy'yi kullanabilirsiniz.

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

Tamsayı dizisini kayan bir diziye dönüştürmek istiyorsanız, ona 0 ekleyin.

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

1

Ben böyle yapardım.

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

türü dize listesi olarak görüntüler. Bu listeyi numpy kullanarak aynı anda bir kayan nokta dizisine dönüştürebilirsiniz:

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

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

0

Önce float dizeleri listesinden sayıları ayıklamak zorunda kaldım:

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

sonra her biri bir şamandıraya dönüşür

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

sonunda tüm şamandıraları bir veri çerçevesine float64 olarak atayın:

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

0

Programımda bu sorunu kullanarak çözdüm:

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

1
OP bir metin dosyasından okuduğunu belirtir. bu cevap istenenler için geçerli değildir.
Ilhicas

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.