比较自定义分数

时间:2016-11-01 07:33:14

标签: python

我现在正在book工作,我对exercises(#6)之一有疑问。 所以我们有一个手工制作的Fraction类,除了所有其他类型的东西,我们想要比较两个分数。

class Fraction:
    def __init__(self, num, den):
        if not (isinstance(num, int) and isinstance(den, int)):
            raise ValueError('Got non-int argument')
        if den == 0:
            raise ValueError('Got 0 denominator')
        self.num = num
        self.den = den

    # some class methods 

    def __lt__(self, other):
        selfnum = self.num * other.den
        othernum = other.num * self.den
        return selfnum < othernum

    # some class methods

# trying it out
x = Fraction(1, -2)
y = Fraction(1, 3)

但是,当我们评估x < y时,结果为False。我想要制作新的属性来存储符号,但这会让一切都搞砸了。

由于缺乏更好的替代方案,我在方法中添加了if,这就是我得到的内容

def __lt__(self, other):
    selfnum = self.num * other.den
    othernum = other.num * self.den
    if self.den * other.den > 0:
        return selfnum < othernum
    else:
        return selfnum > othernum

虽然它似乎有效,但我想知道,如果有更优雅的解决方案。

更新 存储登录分子做我想要的(我可以改变2行而不是在每种方法中添加条件)。

1 个答案:

答案 0 :(得分:2)

如果您假设两个分母都是正数,则可以安全地进行比较(因为a/b < c/d意味着ad < bc)。我只想将符号存储在分子中:

self.num = abs(num) * (1 if num / den > 0 else -1)
self.den = abs(den)

或者:

self.num = num
self.den = den

if self.den < 0:
    self.num = -self.num
    self.den = -self.den

您的__lt__方法可以是:

def __lt__(self, other):
    return self.num * other.den < other.num * self.den