Python中漂亮的多项式打印

3
我应该使用什么格式字符串来打印像 2x^3 + 3x^2 - 6x + 1 这样的表达式(注意符号两侧的空格)?
30.1x^2 + 60.2x - 90.3

并且(如果简单明了)

x^2 + 2x + 1(如果系数为1,则x项中没有系数)。

我尝试在强制符号之间插入填充,例如:

"{0: =+}x^2 {1: =+}x {2: =+}".format(1, -2, 3)

但是没有出现任何填充。

3
你的表达式使用的源数据结构是什么?是字符串、函数、列表还是其他什么? - vittore
我认为你需要拥有自己的__str__方法。 - Mihai Maruseac
1
我认为这不是一个不合理的问题,但请通过展示你已经做了什么(并解释你的数据结构)来表现出一些努力。 - NPE
你想要- x^2 + 1还是-x^2 + 1 - Eric
此外,为了好玩,您可以使用 u"⁰¹²³⁴⁵⁶⁷⁸⁹" 显示内容。 - Eric
否定运算符可能不应该有任何填充。 - user1505713
4个回答

3

由于您没有说明,我假设您的表达式已经是字符串形式,您只需要让它们看起来更好。在这种情况下,可以使用简单的replace调用在符号两侧添加空格。

def add_spaces_to_either_side_of_signs(s):
    return s.replace("+", " + ").replace("-", " - ")

expressions = [
    "2x^3+3x^2-6x+1",
    "30.1x^2+60.2x-90.3",
    "x^2+2x+1"
]

for expression in expressions:
    print "non-pretty version:", expression
    print "pretty version:    ", add_spaces_to_either_side_of_signs(expression)

结果:

non-pretty version: 2x^3+3x^2-6x+1
pretty version:     2x^3 + 3x^2 - 6x + 1
non-pretty version: 30.1x^2+60.2x-90.3
pretty version:     30.1x^2 + 60.2x - 90.3
non-pretty version: x^2+2x+1
pretty version:     x^2 + 2x + 1

1
假设您有表示“2x ^ 3 + 3x ^ 2-6x + 1”的 [1,-6,3,2] :
class Polynomial(list): 
    def __repr__(self):
        # joiner[first, negative] = str
        joiner = {
            (True, True): '-',
            (True, False): '',
            (False, True): ' - ',
            (False, False): ' + '
        }

        result = []
        for power, coeff in reversed(list(enumerate(self))):
            j = joiner[not result, coeff < 0]
            coeff = abs(coeff)
            if coeff == 1 and power != 0:
                coeff = ''

            f = {0: '{}{}', 1: '{}{}x'}.get(power, '{}{}x^{}')

            result.append(f.format(j, coeff, power))

        return ''.join(result) or '0'

>>> Polynomial([1, -6, 3, 2])
2x^3 + 3x^2 - 6x + 1
>>> Polynomial([1, -6, 3, -2])
-2x^3 + 3x^2 - 6x + 1
>>> Polynomial([])
0

0
import re

expressions = ["2x^3+3x^2-6x+1", "30.1x^2+60.2x-90.3", "x^2+2x+1"]

for i in expressions:
  print re.sub('.', lambda m: {'+':' + ', '-':' - '}.get(m.group(), m.group()), i)

0

如果你真的想让你的输出看起来很棒,比如你要发表论文之类的,你可以输出LaTeX来排版你的方程式。

http://oneau.wordpress.com/2011/12/25/latex-sympy/

使用Python打印LaTeX公式

另外,你知道Sage数学工具吗?它将Python与众多数学库结合在一起。如果你使用Sage,你可以处理符号方程,并且你的“工作簿”将显示由TeX渲染的方程。Sage使用JavaScript编写的TeX子集来排版你的方程!注意:Sage选择使用^运算符表示乘方,就像你在例子中所做的那样。在Sage中,你可以使用^而不是**来输入方程。

http://www.sagemath.org/doc/tutorial/tour_algebra.html

http://sagemath.org/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接