比较自定义分数

2024-06-02 08:37:36 发布

您现在位置: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

虽然这似乎是工作,我想知道,如果有更优雅的解决方案。你知道吗

更新 存储sign-in-numerator实现了我想要的功能(我可以只更改两行,而不是在每个方法中添加一个条件)。你知道吗


Tags: selfreturnifdefnumclassintisinstance
1条回答
网友
1楼 · 发布于 2024-06-02 08:37:36

如果假设两个分母都是正的,那么可以安全地进行比较(因为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

相关问题 更多 >