我正在使用sympy来编写代数表达式并使用它们执行基本计算。 Sympy没有跟踪变量的顺序,这些变量在打印表达式时可能会出现问题(问题已经提出here和here,所以这不是重复的。 e.g。
>>> from sympy import *
>>> var("p,a")
>>> l=p-1-a;
>>> print(l);
-a+p-1
但是,sympy似乎按字母顺序打印变量。有没有办法改变Python所指的alphebetical顺序,从而欺骗同意按所需顺序打印变量?欢迎任何其他解决方案!
答案 0 :(得分:0)
有关创建自定义打印机的一些新文档是in the pipe。也许这会有所帮助?我会创建一个自定义打印机 - 让我们说我们创建一个自定义的添加打印机 - 根据某个属性(例如度数或符号的系数)对args进行排序,然后打印生成的Add。
答案 1 :(得分:0)
感谢smichr's answer,我写了一台自定义打印机,可以满足我的需求。我不是一个优秀的程序员,所以如果你对我的代码有任何建议,我很乐意实现它们。
from sympy import *
import math
import copy
import collections
import itertools
init_printing(use_unicode=True)
var("p,a,b,c,d,e,f");
ddict=collections.OrderedDict([(p, 1),(a, 2), (b, 3), (c, 4),(d, 5),(e, 6),(f, 7),])
from sympy import Basic, Function, Symbol
from sympy.printing.printer import Printer
from sympy.printing.latex import print_latex
from sympy.core.basic import Basic
class MyPrinter(Printer):
printmethod = '_myprinter'
def _print_Add(self,expr):
expr_args=expr.args
def new_place(el):
if el in ddict:
return ddict[el]
else:
return len(ddict)+1
def get_place(el):
if el.is_integer:
return new_place(el)
elif el.is_symbol:
return new_place(el)
elif len(el.args)>0:
if el.args[len(el.args)-1].is_symbol:
return new_place(el.args[len(el.args)-1])
else:
return 0
else:
return 0
def write_coeff(el):
if el.is_integer:
if el>0:
return "+%s" %el
else:
return "%s" %el
elif el.is_symbol:
return "+%s" %el
elif len(el.args)>0:
if el.args[len(el.args)-1].is_symbol:
if el.args[0].is_rational:
if el.args[0]>0:
return "+%s" %latex(el)
else:
return "%s" %latex(el)
else:
return "%s" %latex(el)
else:
return "%s" %latex(el)
else:
return "%s" %el
list_place=[get_place(a) for a in expr.args]
expr_args=zip(*sorted(zip(list_place,expr_args)))[1]
to_print=[write_coeff(a) for a in expr_args]
to_print[0]=str(latex(expr_args[0]))
return "".join(a for a in to_print)
def my_printer(expr):
return (MyPrinter().doprint(expr))
de=-a+p+3+c-b
print(my_printer(de))