重新排序 SymPy 表达式

问题描述 投票:0回答:2

我有一个

-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
python expression sympy
2个回答
1
投票

这是一个打印问题。无论您以什么顺序放置参数,它们都会以相同的方式打印。这个问题会定期出现,我在这里尤其是这里有答案。因此,如果您有两个参数,则需要确定其中是否只有一个具有负号(例如使用

sympy.core.function._coeff_isneg
),创建一个未计算的 Add (
Add(pos, neg, evaulate=False)
),然后在告诉打印机不要重新打印后使用打印机打印该参数-订购条款。

>>> 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

0
投票

这里有一个解决这个问题的方法,它也可以接受不是

sympy.Add
类型的表达式,并仅用重新排序的添加物替换其中的添加物,并最终返回最终的乳胶:

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')

这最初是添加到问题的修订版 2中的。

© www.soinside.com 2019 - 2024. All rights reserved.