【问题标题】:Pretty polynomial printing in pythonpython中的漂亮多项式打印
【发布时间】:2013-12-23 18:49:57
【问题描述】:

我会用什么格式的字符串来打印类似的表达式

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)

但没有出现填充。

【问题讨论】:

  • 你的表达式的源数据结构是什么?是字符串还是函数还是列表还是什么?
  • 我认为你需要有自己的__str__ 方法。
  • 我不认为这是一个不合理的问题,但请通过展示您到目前为止所获得的内容(并解释您的数据结构)来展示您的努力。
  • 你想要- x^2 + 1还是-x^2 + 1
  • 另外,你可以使用u"⁰¹²³⁴⁵⁶⁷⁸⁹"显示东西

标签: python formatting


【解决方案1】:

由于您没有指定,我假设您的表达式已经是字符串形式,您只需让它们看起来更好。在这种情况下,可以通过简单的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

【讨论】:

    【解决方案2】:

    假设你有[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
    

    【讨论】:

      【解决方案3】:

      如果你真的希望你的输出看起来很棒,比如这是你想要发表的一篇论文,你可以输出排版你的方程式的 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/

      【讨论】:

        【解决方案4】:
        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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-06
          • 2014-05-12
          • 1970-01-01
          • 2012-03-25
          • 2020-11-10
          • 2019-04-23
          • 2011-05-06
          相关资源
          最近更新 更多