Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当内部结构发生更改时,打印Symphy的整个表达式对象_Python_Expression Trees_Sympy - Fatal编程技术网

Python 当内部结构发生更改时,打印Symphy的整个表达式对象

Python 当内部结构发生更改时,打印Symphy的整个表达式对象,python,expression-trees,sympy,Python,Expression Trees,Sympy,因此,正如问题所说,我希望在其树的内部结构发生变化时打印整个表达式对象,但由于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):

因此,正如问题所说,我希望在其树的内部结构发生变化时打印整个表达式对象,但由于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

有谁能给我建议一下如何做到这一点。

对你所拥有的可能就是你所寻找的东西稍加修改:

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

谢谢,先生,但我的意思是在上面的代码中,每当操作表达式树的内部节点时。表达式树将仅在返回新obj后更新。我想要的是打印带有特定更新节点的整个表达式树。我想在4更新为
x*(x+1)+3*x
后立即打印整个表达式树,也许您可以在可变容器(如列表)中收集替换,而不是打印它们,然后逐个“重放替换”,例如
replacements=[(旧的、新的),…];对于替换中的o,n:打印expr.subs(o,n)
好的,先生,我会尝试这样做。现在,我通过为每个节点生成前缀代码来管理它,然后用新的obj替换obj,并在进行更改时获得完整的表达式。