执行Sympify时,表达式的顺序将被切换(Python的Sympy)

执行Sympify时,表达式的顺序将被切换(Python的Sympy),python,math,sympy,mathjax,mathml,Python,Math,Sympy,Mathjax,Mathml,我运行了以下程序 from sympy import * str = "Abs(a)*(β-α)**3/6" print(str) print(sympify(str)) 执行结果如下 Abs(a)*(β-α)**3/6 (-α + β)**3*Abs(a)/6 Abs(a)*(β-α)**3/6 Abs(a)*(β-α)**3/6 由于执行了sympify,表达式的顺序已更改 我希望匹配执行结果,如下所示 Abs(a)*(β-α)**3/6 (-α + β)**3*Abs(a)/6

我运行了以下程序

from sympy import *

str = "Abs(a)*(β-α)**3/6"
print(str)
print(sympify(str))
执行结果如下

Abs(a)*(β-α)**3/6
(-α + β)**3*Abs(a)/6
Abs(a)*(β-α)**3/6
Abs(a)*(β-α)**3/6
由于执行了
sympify
,表达式的顺序已更改

我希望匹配执行结果,如下所示

Abs(a)*(β-α)**3/6
(-α + β)**3*Abs(a)/6
Abs(a)*(β-α)**3/6
Abs(a)*(β-α)**3/6
我该怎么办


我之所以要这样做,是因为我不想在将表达式转换为mathml格式时让它看起来很奇怪

str = "Abs(a)*(β-α)**3/6"
print(mathml(sympify(str),printer='presentation'))
当执行上述程序时,输出以下内容

<mrow><mfrac><mrow><msup><mfenced><mrow><mrow><mo>-</mo><mi>&#945;</mi></mrow><mo>+</mo><mi>&#946;</mi></mrow></mfenced><mn>3</mn></msup><mo>&InvisibleTimes;</mo><mrow><mfenced clos
e="|" open="|"><mi>a</mi></mfenced></mrow></mrow><mn>6</mn></mfrac></mrow>
-α+β3.隐形时间;a6
它看起来像下图

我希望公式如下图所示


如果您将以下差异应用于SymPy,我认为您的案例将有效:

diff --git a/sympy/printing/str.py b/sympy/printing/str.py
index ee560ca..cb0db5e 100644
--- a/sympy/printing/str.py
+++ b/sympy/printing/str.py
@@ -51,6 +51,8 @@ def _print_Add(self, expr, order=None):

         PREC = precedence(expr)
         l = []
+        if len(terms) == 2 and str(terms[0])[0] == '-' and str(terms[1])[0] != '-':
+            terms.reverse()
         for term in terms:
             t = self._print(term)
             if t.startswith('-'):

(它以相同的方式打印
b-a
,而不是
-a+b

我认为你对此无能为力。。。Sympy正在对表达式应用有效的转换。您必须编写自己的代码才能生成所需的输出。