我正在制作一个多项式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}}。指数的顺序似乎是倒退的,代码只是忽略了最后的系数。
答案 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)
有几个问题:
range
而不是1; len(self.coeffs)-1-i
; 我会将[2,3,4]
作为2+3x+4x^2
处理,因为稍后处理更复杂的计算会更容易,但您可能有充分的理由想要相反的。
答案 2 :(得分:0)
这应打印:p1
的2 * x ^ 2 + 3 * x + 4 * 1class 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('+ -', '- ')