Строка Python или дробь или плавать, чтобы плавать - PullRequest
0 голосов
/ 31 мая 2018

У меня проблема с тем, что я хочу взять строку, которая может содержать либо дробь вроде '1/6', либо число с плавающей запятой '2.0', и они оба получат окончательное значение с плавающей точкой.То, что я не знаю, как это сделать, так это разобраться с возможностью того, что дело возникнет, или с тем, как их обработать, чтобы я получил вывод с плавающей запятой дроби.

numberArray = []
d1 = 0
d2 = 0

fileInput = f.readlines()

for line in fileInput:
    numberArray.append(line)

for i in numberArray:
    content = i.replace("\n","").split(" ")

    d1 = (float(content[0]))
    //The rest of data in the line is stored below (d2, d3 etc), but this isn't 
    // important. The important part is the first item that comes up in each line, 
    //and whether or not it is a fraction or already a float.

Вход:

1/3 ...(rest of the line, not important)
2.0 ...

Выход:

d1 (line1, item1) = 0.33
d2 (line1, item2) = ...

d1 (line2, item1) = 2.0
d2 (line2, item2) = ...

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Конструктор fractions.Fraction уже знает, как проанализировать как float -подобные строки, так и дробные строки и получить результат Fraction.Например:

>>> from fractions import Fraction
>>> float(Fraction('1/3'))
0.3333333333333333
>>> float(Fraction('2.0'))
2.0

Поскольку Fraction можно преобразовать в float, вы можете использовать это, чтобы безоговорочно получить float результат:

from fractions import Fraction

for line in f:
    content = line.strip('\r\n').split(" ")

    d1 = float(Fraction(content[0]))
    //The rest of data in the line is stored below (d2, d3 etc), but this isn't 
    // important. The important part is the first item that comes up in each line, 
    //and whether or not it is a fraction or already a float.

Я взял на себя свободукардинально упростить ваш код;f.readlines() уже вернул бы list, поэтому бессмысленно повторять его снова для заполнения numberArray, и так как вам кажется, что в любом случае numberArray заполняется только один раз, проще просто итерировать файл напрямую, чемделая два бессмысленных временныхЕсли вам действительно нужен list, вы просто делаете:

numberArray = f.readlines()
for line in numberArray:

, чтобы загрузить list один раз и сохранить его напрямую, а не копировать элемент за элементом.

0 голосов
/ 31 мая 2018

Я новичок в Python, так что это может быть не самое элегантное решение, но может быть что-то вроде:

import re

values = ["3.444", "3", "1/3", "1/5"]

def to_float(str):
    is_frac = bool(re.search("/", str))
    if is_frac:
        num_den = str.split("/")
        return float(num_den[0]) / float(num_den[1])
    else:
        return float(str)

floats = [to_float(i) for i in values]
print(floats)
...