因为问题说我想在其树的内部结构发生变化时打印整个表达式对象,但由于sympy对象是不可变的,我不能用对象绑定的名称来执行此操作
以下是关于我如何更改内部结构的代码示例
from sympy import *
from sympy.abc import x,y
input = 'x*(x+4)+3*x'
expr = sympify(input,evaluate=False)
def traverse(expr):
if(expr.is_Number):
return 1,True
oldexpr = expr
args = expr.args
sargs = []
hit = False
for arg in args:
arg,arghit = traverse(arg)
hit |= arghit
sargs.append(arg)
if(hit):
expr = expr.func(*sargs)
return expr,True
else:
return oldexpr,False
print(srepr(expr))
expr,hit = traverse(expr)
print(expr)
这里每当我遇到表达式树中的数字时,我都会将数字更改为1。当我做出如下更改时,我想要打印完整的表达式:x*(x+1)+3*x
然后x*(x+1)+x
任何人都可以建议我如何实现这一目标。
答案 0 :(得分:0)
您可能正在寻找的东西只是一个微小的模式:
def traverse(expr):
if any(a.is_Number and abs(a) != 1 for a in expr.args):
print(expr,'->',expr.func(*[(a if not a.is_Number else 1) for a in expr.args]))
if expr.is_Number and abs(expr) != 1:
return 1, True
oldexpr = expr
args = expr.args
sargs = []
hit = False
for arg in args:
arg,arghit = traverse(arg)
hit |= arghit
sargs.append(arg)
if(hit):
expr = expr.func(*sargs)
return expr, True
else:
return oldexpr, False
这会产生
>>> traverse(2*x+3)
(2*x + 3, '->', 2*x + 1)
(2*x, '->', x)
(x + 1, True)
/ C