当内部结构发生变化时,打印sympy的整个表达式对象

2024-10-01 07:13:24 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,正如问题所说,当表达式对象的树的内部结构发生变化时,我想打印整个表达式对象,但由于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 有谁能给我建议如何做到这一点。你知道吗


Tags: 对象fromimportfalseinputreturn表达式arg
1条回答
网友
1楼 · 发布于 2024-10-01 07:13:24

只是对你所拥有的东西稍加修改,可能就是你想要的:

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)

/共

相关问题 更多 >