如果我理解正确,您的问题不在于“如何将浮点数转换为分数”,而是“如何从数字数组中获取分数的字符串表示形式”,对吧?
实际上你可以在一行中做到这一点:
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,它正在为“数组 p 中的每个 x 和数组 q 中的每个 y”生成数对。
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]
消除重复
此外,如果您想消除重复项,只需将整个列表包装在 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']