Если я правильно понял, ваша проблема заключается не в том, «как преобразовать числа с плавающей запятой в дроби», а в том, «как получить строковое представление дроби из массивов чисел», верно?
На самом деле вы можете это сделать в одной строке:
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']