Python 的fractions
模块旨在使用精确的有理数(无论是分数、小数还是其他),而不是近似浮点数。因此,他们故意没有使用一对float
s 或由两个浮点数组成的字符串分数的构造函数。
但是,它们确实有一个构造函数,该构造函数采用单个float
或单个字符串浮点数。如果你知道这是你真正想要的,你可以这样做:
>>> f = Fraction('1') / Fraction('1.6')
Fraction(5, 8)
>>> f = Fraction(1) / Fraction(1.6)
Fraction(2251799813685248, 3602879701896397)
您可能会注意到Fraction('1.6')
返回的内容与Fraction(1.6)
. 前者返回将呈现为“1.6”的最简单的分数;后者返回与不精确浮点值 1.6 匹配的最简单分数。
所以:
>>> a = ['1/1.6', '1/2.5', '3/4', '1.1/10']
>>> nd = [x.split('/') for x in a]
>>> nd
[['1', '1.6'], ['1', '2.5'], ['3', '4'], ['1.1', '10']]
>>> f = [Fraction(x[0]) / Fraction(x[1]) for x in nd]
>>> f
[Fraction(5, 8), Fraction(2, 5), Fraction(3, 4), Fraction(11, 100)]
>>> sorted(f)
[Fraction(11, 100), Fraction(2, 5), Fraction(5, 8), Fraction(3, 4)]
把它们放在一起,如果你想按照小数点的等效值对字符串列表进行排序:
>>> def fractionize(s):
>>> n, d = s.split('/')
>>> return Fraction(n) / Fraction(d)
>>> sorted(a, key=fractionize)
['1.1/10', '1/2.5', '1/1.6', '3/4']
当然,如果您需要做很多此类事情,您可能想要编写自己的分数模块(或查看已经编写的数千个在线食谱),它可以只处理 '1/1.6'你想要的方式,所以你不需要这个fractionize
功能。