如何修改sympy的打印顺序?

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

我正在使用 sympy 编写代数表达式并用它们执行基本计算。 Sympy 不跟踪变量的顺序,这在打印表达式时可能会出现问题, 例如

>>> from sympy import *
>>> var("p,a")
>>> l=p-1-a;
>>> print(l);
-a+p-1

但是,sympy 似乎按字母顺序打印变量。有没有办法改变Python引用的字母顺序,从而欺骗sympy以所需的顺序打印变量?

类似的问题已经在防止 Sympy 重新排列方程避免在 Python 模块 Sympy 中排序参数中提出。

python sympy
2个回答
1
投票

一些有关创建自定义打印机的新文档已在管道中。也许这会有帮助?我会创建一个自定义打印机——假设我们创建一个自定义 Add 打印机——根据某些属性(例如项系数的度数或符号)对参数进行排序,然后打印结果 Add。


1
投票

感谢smichr的回答,我编写了一个自定义打印机,它可以满足我的需求。我不是一个好的程序员,所以如果您对我的代码有任何建议,我很乐意实现它们。

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))
© www.soinside.com 2019 - 2024. All rights reserved.