簡體   English   中英

在 Python 中創建多項式類

[英]Creating Polynomial Class in Python

我目前正在創建一個 Polynomial 類,其中包括addmuleval方法。 我目前被困在加法部分,如果有人能給我一些關於如何解決這個問題的幫助,我將不勝感激。 目前一切正常,沒有錯誤,但是當我執行 p3 = p1 + p2 並打印 p3 時,我將兩個列表一起返回。 任何反饋將不勝感激。

class Polynomial(object):

    def __init__(self, *coeffs, num = 0):

        self.coeffs = list(coeffs) # turned into a list

        assert (type(num) is type(1)) 
        self.num = num

    # Needs to be operator overload
    '''
    def __mul__(self, other):
    '''

    def __eval__(self, other, coeff, x):
        result = coeff[-1]
        for i in range(-2, -len(coeff)-1, -1):
            result = result * x + coeff[i]
        return result


    def __add__(self, other):

        assert type(other) is Polynomial

        num = self.coeffs + other.coeffs

        return Polynomial(num)


    def __sub__(self, other):

        assert type(other) is Polynomial
        num = self.coeffs - other.coeffs

        return Polynomial(num)




    def __represntation__(self):
        return "Polynomial" + str(self.coeffs)   

    def __str__(self):
        rep = ""    
        degree = len(self.coeffs) - 1
        rep += str(self.coeffs[0]) + "x^" + str(degree)       
        for i in range(1, len(self.coeffs)-1):
            coeff = self.coeffs[i]
            if coeff < 0:
                rep += " - " +  str(-coeff) + "x^" + str(degree - i)
            else:
                rep += " + " +  str(coeff) + "x^" + str(degree - i)

            if self.coeffs[-1] < 0:
                rep += " - " + str(-self.coeffs[-1])
        else:
            rep += " + " + str(self.coeffs[-1])  
        return rep

問題在這里:

num = self.coeffs + other.coeffs

將一個列表添加到另一個列表它們連接起來。 簡單地相互添加相應的元素,你想要做

from itertools import zip_longest

...

num = [a + b for (a, b) in zip_longest(self.coeffs, other.coeffs, fillvalue=0)]

我們使用zip_longest()而不是更通用的zip()因為一個多項式可能比另一個長,我們不想破壞它。 它們中的任何一個都會將相應的元素組合在一起,以便我們可以輕松地添加它們並列出這些元素。

你會為減法做類似的事情。

您不能直接添加兩個列表。

def __add__(self, other):

    assert type(other) is Polynomial
    assert len(self.coeffs) != len(other.coeffs)

    new_ceffs = [item1 + item2 for (item1, item2) in zip(self.coeffs, other.coeffs)]

    return Polynomial(new_ceffs)

您應該顛倒傳遞給構造函數的系數的順序,以便self.coeffs列表中的索引對應於指數。 這將簡化您的其余代碼,並允許您使用 zip_longest 進行加法和減法。

但是,當您進行其他操作時,我想您會意識到如果它是一本字典,您的內部結構會更容易管理。 字典對丟失條目的容忍度更高,從而避免了為新索引分配空間的擔憂。

class Polynomial(object):

    def __init__(self, *coeffs):
        self.coeffs = {exp:c for exp,c in enumerate(coeffs[::-1])}
    
    def __add__(self, other):
        assert type(other) is Polynomial
        result = Polynomial(0)
        result.coeffs = {**self.coeffs}
        for exp,c in other.coeffs.items():
            result.coeffs[exp] = result.coeffs.get(exp,0) + c
        return result

    def __sub__(self, other):
        assert type(other) is Polynomial
        result = Polynomial(0)
        result.coeffs = {**self.coeffs}
        for exp,c in other.coeffs.items():
            result.coeffs[exp] = result.coeffs.get(exp,0) - c
        return result

    def __mul__(self, other):
        assert type(other) is Polynomial
        result = Polynomial(0)
        for exp1,c1 in self.coeffs.items():
            for exp2,c2 in other.coeffs.items():
                result.coeffs[exp1+exp2] = result.coeffs.get(exp1+exp2,0) + c1*c2
        return result
        
    def __representation__(self):
        return "Polynomial" + str(self.coeffs)   

    def __str__(self):
        result = [""]+[f"{c}x^{i}" for i,c in sorted(self.coeffs.items()) if c]+[""]
        result = "+".join(reversed(result))
        result = result.replace("+1x","+x")
        result = result.replace("-1x","-x")
        result = result.replace("x^0","")
        result = result.replace("x^1+","x+")
        result = result.replace("+-","-")
        result = result.strip("+")
        result = result.replace("+"," + ")
        result = result[:1]+result[1:].replace("-"," - ")
        return result.strip()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM