Преобразовать список фракций в поплавки в Python - PullRequest
7 голосов
/ 26 августа 2010

У меня есть список дробей, таких как:

data = ['24/221 ', '25/221 ', '24/221 ', '25/221 ', '25/221 ', '30/221 ', '31/221 ', '31/221 ', '31/221 ', '31/221 ', '30/221 ', '30/221 ', '33/221 ']

Как бы я мог преобразовать их в числа с плавающей точкой, например

data = ['0.10 ', '0.11 ', '0.10 ', '0.11 ', '0.13 ', '0.14 ', '0.14 ', '0.14 ', '0.14 ', '0.14 ', '0.13 ', '0.13 ', '0.15 ']

Модуль Fraction, кажется, толькопреобразовать в Fractions (не из), а для float([x]) требуется строка или целое число.

Ответы [ 7 ]

12 голосов
/ 26 августа 2010
import fractions
data = [float(fractions.Fraction(x)) for x in data]

или для точного соответствия вашему примеру (данные заканчиваются строками):

import fractions
data = [str(float(fractions.Fraction(x))) for x in data]
2 голосов
/ 26 августа 2010
import fractions
data = [str(round(float(fractions.Fraction(x)), 2)) for x in data]
1 голос
/ 27 августа 2010

Использование модуля дроби приятно и аккуратно, но довольно тяжело (медленнее) по сравнению с простым разбиением строки или разбиением

Это понимание списка создает поплавки, так как ответ с наибольшим количеством голосов

[(n/d) for n,d in (map(float, i.split("/")) for i in data)]

Если вы хотите две строки десятичных разрядов

["%.2f"%(n/d) for n,d in (map(float, i.split("/")) for i in data)]
0 голосов
/ 17 мая 2019

Все предыдущие ответы кажутся мне слишком сложными. Самый простой способ сделать это, а также сделать множество других преобразований, это использовать eval ().

Ниже приведен один метод

l=['1/2', '3/5', '7/8']
m=[]
for i in l
   j=eval(i)
   m.append(j)

Версия для понимания списка выше - еще один метод

m= [eval(i) for i in l] 

каждый метод дает m как

[0,5, 0,75, 0,875]

0 голосов
/ 26 августа 2010

Вложенные списки помогут вам получить ответ без импорта дополнительных модулей (дроби только в Python 2.6 +).

>>> ['%.2f' % (float(numerator)/float(denomator)) for numerator, denomator in [element.split('/') for element in data]]
['0.11', '0.11', '0.11', '0.11', '0.11', '0.14', '0.14', '0.14', '0.14', '0.14', '0.14', '0.14', '0.15']
0 голосов
/ 26 августа 2010
data = [ x.split('/') for x in data ]
data = [ float(x[0]) / float(x[1]) for x in data ]
0 голосов
/ 26 августа 2010
def split_divide(elem):
    (a,b) = [float(i) for i in elem.split('/')]
    return a/b

map(split_divide, ['1/2','2/3'])

[0,5, 0,66666666666666663]

...