将方程建模为树

时间:2011-06-16 09:39:57

标签: python parsing binary-tree

我想在python中将方程模型化为树。 例如:

x = exp(((-0.5)*((f/sqrt(d))**2)))

我该怎么做?我希望能够切换树枝, 删除树的部分等,然后将其转换回 文本形式的新方程式。

你能给我一些可以做到这一点的示例代码/库吗?

欢呼声 编辑1:

我现在走到这一步:

import compiler
import pprint
import parser
import ast
class Py2Neko(ast.NodeTransformer):
    def generic_visit(self, node):
        print type(node).__name__
        ast.NodeVisitor.generic_visit(self, node)

    def visit_Name(self, node):
        print 'Name :', node.id

    def visit_Num(self, node):
        print 'Num :', node.__dict__['n']

    def visit_Str(self, node):
        print "Str :", node.s

    def visit_Print(self, node):
        print "Print :"
        ast.NodeVisitor.generic_visit(self, node)

    def visit_Assign(self, node):
        print "Assign :"
        ast.NodeVisitor.generic_visit(self, node)

    def visit_Expr(self, node):
        print "Expr :"
        ast.NodeVisitor.generic_visit(self, node)

if __name__ == '__main__':
    node = ast.parse("res= exp(((-0.5*one)*((delta_w*one/delta*one)**2)))")

    # print ast.dump(node)
    v = Py2Neko()
    v.visit(node)

现在它打印树的所有节点。但是我希望能够切换分支, 删除分支,插入分支和更改运算符/操作数。 我需要这个,因为我希望能够随机改变树。

3 个答案:

答案 0 :(得分:1)

运算符和函数是父节点,操作数是叶子。

x = exp(((-0.5)*((f/sqrt(d))**2)))

从自上而下的方法开始:[operator {operand1,operand2}]

[ = { x, exp(((-0.5)*((f/sqrt(d))**2))) }]

接下来是:

[ = { x, [ * { exp(((-0.5), ((f/sqrt(d))**2))) }] }]

然后:

[ = { x, [ * { [ exp { -0.5 }],  [ ** { f/sqrt(d)), 2 }] }] }]

你明白了。

link可能是您的答案。

答案 1 :(得分:0)

PyParsing应该可以帮到你。 (严格来说,我假设你的等式可能不一定是使用Python语法本身。)

答案 2 :(得分:0)

你想要的是构建和使用解析树。除了内置的解析之外,如果你的方程式超出了python的原生语法,请查看this overview,这可能是过时的。那里有很多选择。