当分母本身是一个分数时,分类分数

时间:2012-09-27 23:23:41

标签: python fractions

几分钟前,我问了一个关于排序字典的问题,其中键是分数(简单分数)。

我现在知道我必须使用分数模块,但当分数的分母本身就是分数时,模块不起作用。

e.g。

“1 / 1.6”,1 / 2.5“

>>> import fractions
>>> f = '1/1.6'
>>> fractions.Fraction(f)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/fractions.py", line 125, in __new__
    numerator)
ValueError: Invalid literal for Fraction: '1/1.6'

任何想法??

2 个答案:

答案 0 :(得分:5)

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功能。

答案 1 :(得分:2)

您可以eval数组中的所有元素,如下所示:

a = ["1/1.6","1/2.5","6+7","-1*3"]
sorted(a, key=eval)

返回

['-1*3', '1/2.5', '1/1.6', '6+7']

它可能有点慢,但它应该有用。

请注意,您需要python31/3之类的分数正常工作(因为在python2中/是整数除法,而不是浮点除法。要修复,可以添加{{1到所有字符串的开头)。