Opprette Polynom klasse i Python

stemmer
1

Jeg jobber for tiden på å lage et polynom klasse som inkluderer tillegget , mul og eval metoder. Jeg er for tiden fast på tillegg del, hvis noen kunne gi meg litt hjelp på hvordan å få det funnet ut at ville bli verdsatt. Alt fungerer for tiden uten feil, men når jeg gjør p3 = p1 + p2 og skrive jeg p3 jeg få tilbake de to listene sammen. Enhver tilbakemelding vil bli verdsatt.

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
Publisert på 13/02/2020 klokken 23:53
kilden bruker
På andre språk...                            


3 svar

stemmer
0

Problemet er her:

num = self.coeffs + other.coeffs

Legge til en liste til en annen liste Setter sammen dem. Å bare legge til tilsvarende elementer til hverandre, vil du ønsker å gjøre

from itertools import zip_longest

...

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

Vi bruker zip_longest()i stedet for den mer generiske zip()fordi en polynom er muligens lengre enn den andre, og vi ønsker ikke å ødelegge det. Noen av dem vil gruppen sammen de tilsvarende elementene slik at vi enkelt kan legge dem og lage en liste over dem.

Du ville gjøre noe lignende for subtraksjon.

Svarte 13/02/2020 kl. 23:57
kilden bruker

stemmer
0

Du kan ikke legge til to lister.

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)
Svarte 14/02/2020 kl. 00:02
kilden bruker

stemmer
0

du bør snu rekkefølgen på koeffisientene sendes til din konstruktøren slik at indeksene i self.coeffslisten tilsvarer eksponentene. Dette vil forenkle resten av koden din og lar deg bruke zip_longest for tilføyelser og subtractions.

Når du kommer til andre operasjoner men jeg tror du vil innse at din indre struktur ville være lettere å håndtere hvis det var en ordbok. En ordbok er mer ettergivende av manglende oppføringer for således å unngå opptatthet for fordeling av områder for nye indekser.

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()
Svarte 14/02/2020 kl. 02:48
kilden bruker

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