在python中的漂亮多项式打印

时间:2013-12-23 18:49:58

标签: python formatting

我将使用什么格式字符串来打印像

这样的表达式

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)

但不显示填充。

4 个答案:

答案 0 :(得分: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 :(得分:1)

假设您[1, -6, 3, 2]代表"2x^3 + 3x^2 - 6x + 1"

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

答案 2 :(得分:0)

如果你真的希望你的输出看起来很棒,比如这是你要发布的纸张或其他东西,你可以输出LaTeX来排序你的等式。

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

Print latex-formula with python

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

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

http://sagemath.org/

答案 3 :(得分: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)