python - 当分母是分数本身时对分数进行排序

标签 python fractions

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

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

例如

"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'

有什么想法吗??

最佳答案

Python 的 fractions 模块旨在处理精确的有理数(无论是分数、小数还是其他),而不是近似 float 。因此,他们有意没有采用一对 float 或由两个 float 组成的字符串部分的构造函数。

但是,它们确实有一个采用单个float 或单个字符串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 函数。

关于python - 当分母是分数本身时对分数进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12631495/

相关文章:

python - 如何在Python中的列表中找到每个整数与模的乘积

python - 如何在连续循环中使用python多处理池

python - 如何在 Python 中防止属性初始化为某些值

java - java中简化分数的问题

python - Sympy - 合理化表达式中的所有数值? (就像 Mathematica 的 Rationalize[])

python - 根据条件删除组中的最后一行

python/django - html 选择列表中的 bidi 括号问题

python - Pickler 中 __reduce__ 的具体用法是什么

c++ - 将浮点十进制值转换为分数

regex - 正则表达式以匹配不可约分数