在python中打印多项式

时间:2016-01-17 20:51:35

标签: python

我正在制作一个多项式python类,作为其中的一部分,我需要很好地打印多项式。该类被给出一个表示多项式系数的列表,它们的指数由系数在列表中的位置给出。例如,[2,-3,0,5]会给2x^3-3x^2+5

我尝试接收帐户错误,以便1x只打印x而不是-,如果有负数,则该函数只返回+-而不是class Polynomial: def __init__(self, coefficients): self.coeffs=coefficients def __str__(self): out = '' for i in range(1,len(self.coeffs)): if self.coeffs[i] != 0: out += ' + %g*x^%d' % (self.coeffs[i],i) # Fixing out = out.replace('+ -', '- ') out = out.replace('x^0', '1') out = out.replace(' 1*', ' ') out = out.replace('x^1 ', 'x ') if out[0:3] == ' + ': # remove initial + out = out[3:] if out[0:3] == ' - ': # fix spaces for initial - out = '-' + out[3:] return out

这是我目前的代码

p1 = Polynomial([2,3,4])

尝试打印p1 = 3x+4x^2时,我会{{1}}。指数的顺序似乎是倒退的,代码只是忽略了最后的系数。

4 个答案:

答案 0 :(得分:1)

这是迭代系数的非常简单的方法,通过块构建字符串块并随后加入它。

class Polynomial:
    def __init__(self, coefficients):
        self.coeffs = coefficients

    def __str__(self):
        chunks = []
        for coeff, power in zip(self.coeffs, range(len(self.coeffs) - 1, -1, -1)):
            if coeff == 0:
                continue
            chunks.append(self.format_coeff(coeff))
            chunks.append(self.format_power(power))
        chunks[0] = chunks[0].lstrip("+")
        return ''.join(chunks)

    @staticmethod
    def format_coeff(coeff):
        return str(coeff) if coeff < 0 else "+{0}".format(coeff)

    @staticmethod
    def format_power(power):
        return 'x^{0}'.format(power) if power != 0 else ''


assert str(Polynomial([2, -3, 0, 5])) == "2x^3-3x^2+5"

答案 1 :(得分:0)

有几个问题:

  • 你应该从0开始range而不是1;
  • 权力应为len(self.coeffs)-1-i;
  • 还尝试将特定情况作为数字比较而不是字符串替换处理(使用数值而不是将它们转换为字符串然后检测字符串上的内容更有效。)

我会将[2,3,4]作为2+3x+4x^2处理,因为稍后处理更复杂的计算会更容易,但您可能有充分的理由想要相反的。

答案 2 :(得分:0)

这应打印:p1

的2 * x ^ 2 + 3 * x + 4 * 1
class Polynomial:

def __init__(self, coefficients):
    self.coeffs=coefficients

def __str__(self):
    out = ''
    size = len(self.coeffs)    
    for i in range(size):      #To Solve the ignored coefficient
        if self.coeffs[i] != 0:
            out += ' + %g*x^%d' % (self.coeffs[i],size-i-1)   #To solve Backwards order
    # Fixing
    out = out.replace('+ -', '- ')
    out = out.replace('x^0', '1')
    out = out.replace(' 1*', ' ')
    out = out.replace('x^1 ', 'x ')
    if out[0:3] == ' + ':  # remove initial +
        out = out[3:]
    if out[0:3] == ' - ':  # fix spaces for initial -
        out = '-' + out[3:]
    return out




a = Polynomial([2,3,4])


print(a)

答案 3 :(得分:0)

Python有非常强大的迭代功能,可以帮助你解决这个问题。

对于初学者,请不要将len的内容传递给range。直接迭代某事。

for x in self.coeffs:

但这并不能完全帮助您,因为电源需要迭代索引。 enumerate可以用于此。

for i, x in enumerate(self.coeffs):

然而,这提出了另一个问题。权力是倒退的。为此,您需要reversed

for i, x in enumerate(reversed(self.coeffs)):

从这里你只需要处理你的输出:

items = []
for i, x in enumerate(reversed(self.coeffs)):
    if not x:
        continue
    items.append('{}x^{}'.format(x if x != 1 else '', i))
result = ' + '.join(items)
result = result.replace('x^0', '')
result = result.replace('^1 ', ' ')
result = result.replace('+ -', '- ')