преобразование чисел с плавающей точкой в ​​дроби - PullRequest
0 голосов
/ 26 мая 2020

Пишу Python3. Я создал два списка в своем коде и хочу «связать» их в al oop как дроби. Есть ли возможность сделать это иначе, чем с помощью библиотеки Fractions? К сожалению, я не могу его использовать, потому что это требование задачи. Проблема возникает, когда дробь является числом с плавающей запятой (например, 1/3). Как я могу решить эту проблему?

Вот пример:

p = [1,2,3]
q = [3,5,9]

frac = []
    for i in p:
      for j in q:
        f = i/j
        if f not in frac:
          frac.append(f)



Ответы [ 4 ]

1 голос
/ 26 мая 2020

Вы можете использовать тип fractions.Fraction.

  1. импортируйте это с помощью: from fractions import Fraction
  2. приведите уравнение f f = p / q с Fraction; f = Fraction (p / q)
  3. , тогда также используйте преобразование строки; f = str (Дробь (p / q))

    from fractions import Fraction
    f = str(Fraction(p/q))
    
0 голосов
/ 26 мая 2020

Если я правильно понял, ваша проблема заключается не в том, «как преобразовать числа с плавающей запятой в дроби», а в том, «как получить строковое представление дроби из массивов чисел», верно?

На самом деле вы можете это сделать в одной строке:

p = [1,2,3]
q = [3,5,9]

list(map(lambda pair: f"{pair[0]}/{pair[1]}", [(x, y) for x in p for y in q])))

Объяснение:

map - получает функцию и итератор, передавая каждый элемент итератора этой функции.

[(x, y) for x in p for y in q] - это list comprehension, он генерирует пары чисел «для каждого x в массиве p для каждого y в массиве q».

lambda pair - это anonymous function, получающий аргумент pair (который, как мы знаем, будет tuple '(x, y)') и возвращает строку «x / y» (которая представляет собой «пара [0] / пара [1]»)

Необязательные процедуры

Исключение нулей в знаменателе

Если вы хотите избежать невозможных дробей (например, чего-либо более 0), понимание списка должно быть таким:
[(x, y) for x in p for y in q if x != 0]

Устранение дубликатов

Кроме того, если вы хотите удалить повторяющиеся элементы, просто оберните все list в операции set() (наборы являются повторяющимися с уникальными элементами, и преобразование списка в набор автоматически удаляет повторяющиеся элементы):
set([(x, y) for x in p for y in q if x != 0])

Устранение ненужных повторяющихся отрицательных знаков

Список становится немного больше, но все еще в порядке:
set([(x, y) if x>0 or y>0 else (-x,-y) for x in p for y in q if x != 0])
Объяснение: если x>0 или y>0, это означает, что только одно из них может быть отрицательным числом, так что хорошо, вернись (x, y). Если нет, это означает, что оба они отрицательны, поэтому они должны быть положительными, а затем вернуть (-x, -y).

Тестирование

Конечный результат скрипта:

p = [1, -1, 0, 2, 3]
q = [3, -5, 9, 0]

print(list(map(lambda pair: f"{pair[0]}/{pair[1]}", set([(x, y) if x>0 or y>0 else (-x,-y) for x in p for y in q if y != 0]))))


# output:
# ['3/-5', '2/-5', '1/5', '1/-5', '0/3', '0/9', '2/3', '2/9', '3/3', '-1/3', '-1/9', '0/5', '3/9', '1/3', '1/9'] 

0 голосов
/ 26 мая 2020

Вы можете использовать al oop, чтобы вычислить дробь с помощью простого кода ниже

x = 0.6725
a = 0
b = 1
while (x != a/b):
    if x > a/b:
        a += 1
    elif x < a/b:
        b += 1
print(a, b)

Результат a и b будет

269 400
0 голосов
/ 26 мая 2020

(0.33).as_integer_ratio() может сработать для вашей проблемы. Очевидно, что 0.33 будет заменено любым веществом с плавающей запятой.

Per this question ,

def float_to_ratio(flt):
    if int(flt) == flt:
        return int(flt), 1
    flt_str = str(flt)
    flt_split = flt_str.split('.')
    numerator = int(''.join(flt_split))
    denominator = 10 ** len(flt_split[1])
    return numerator, denominator

это тоже решение.

...