重新排序 SymPy 表达式

Reorder SymPy Expression

我有一个 -x + y 形式的 SymPy 表达式(其中 x、y 是原子,而不是其他表达式),但我想重新排列它们,使它们成为 y - x,所以基本上只是去掉多余的 + 来缩短表达式。
我该怎么做(如果可能的话)?

示例输入和输出:

from sympy import *

expression = -4 + 2*I
reorder(expression) # how can I do that?
print(expression) # expected output: 2*I - 4

编辑:

万一有人需要它,这里有一个解决这个问题的方法,它也可以接受非 sympy.Add 类型的表达式,并只用重新排序的加法替换其中的加法,最终 return最终乳胶:

def negcolast(expr):
    from sympy.core.function import _coeff_isneg as neg
    if isinstance(expr, sympy.Add) and neg(expr.args[0]):
        args = list(expr.args)
        args.append(args.pop(0))
        return sympy.UnevaluatedExpr(sympy.Add(*args,evaluate=False))
    else:
        return expr

def latex(expr):
    expr = expr.replace(sympy.Add, lambda *args: negcolast(sympy.Add(*args)))
    return sympy.latex(expr, order='none')

这是打印问题。无论您将 args 放在什么顺序,它们都将以相同的方式打印。这会定期出现,我有答案 and especially here。因此,如果你有两个参数,你需要找出其中是否只有一个有负号(例如使用 sympy.core.function._coeff_isneg),创建一个未评估的添加(Add(pos, neg, evaulate=False)),然后在告知后用打印机打印它不符合 re-order 条款。

>>> def negcolast(expr):
...     from sympy.core.function import _coeff_isneg as neg
...     if isinstance(expr, Add) and neg(expr.args[0]):
...         args = list(expr.args)
...         args.append(args.pop(0))
...         return LatexPrinter({'order':'none'})._print_Add(Add(*args,evaluate=False))
...     else:
...         return latex(expr)
... 
>>> negcolast(-4+2*I)
2i−4