Létrehozása Polynomial Class Python

szavazat
1

Én jelenleg dolgozik létre egy polinom osztály, amely magában foglalja add , mul és eval módszerekkel. Én jelenleg ragadt hozzáadásával része, ha valaki tudna nekem segíteni, hogyan lehet, hogy rájöttek, hogy lenne nagyon méltányol. Minden jelenleg működik hiba nélkül, de amikor én p3 = P1 + P2 és nyomtatni p3 kapom vissza a két lista együtt. Minden visszajelzést lenne nagyon méltányol.

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
A kérdést 13/02/2020 23:53
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
0

A probléma itt:

num = self.coeffs + other.coeffs

Hozzáadunk egy listát, hogy egy másik listát összefűzi őket. Ahhoz, hogy egyszerűen hozzá tartozó elemek egymáshoz, akkor érdemes csinálni

from itertools import zip_longest

...

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

Az általunk használt zip_longest()helyett az általánosabb zip(), mert az egyik polinom esetleg hosszabb, mint a másik, és nem akarjuk elrontani. Vagy egyikük összevonnák a megfelelő elemeket, hogy mi is könnyen hozzá őket, és egy listát azokról.

Azt, hogy valami hasonló a kivonás.

Válaszolt 13/02/2020 23:57
a forrás felhasználó

szavazat
0

Nem lehet közvetlenül hozzá két listát.

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)
Válaszolt 14/02/2020 00:02
a forrás felhasználó

szavazat
0

akkor fordított sorrendben együtthatók át a kivitelező, hogy indexeket a self.coeffslistán megfelelnek a kitevők. Ez egyszerűsíti a többi a kódot, és lehetővé teszi, hogy használja a zip_longest összeadás és kivonás.

Amikor eljut egyéb műveletek azonban, azt hiszem, akkor rájönnek, hogy a belső szerkezet könnyebb lenne kezelni, ha ez egy szótárban. A szótár megengedőbb a hiányzó bejegyzéseket elkerülve ezzel aggodalmak elosztásának terek új indexek.

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 self.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()
Válaszolt 14/02/2020 02:48
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more