我有一个
-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.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
这里有一个解决这个问题的方法,它也可以接受不是
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中的。