python画树形结构的类封装,graphviz利用,嵌套字典,附完整代码可直接使用

理想结果

自己创建的一个字典,然后根据字典画出的语法树:
自己画的一个语法树

代码及使用提醒

封装的类的使用:

import pydot

menu = {'dinner':
            {'chicken':'good',
             'beef':'average',
             'vegetarian':{
                   'tofu':'good',
                   'salad':{
                            'caeser':'bad',
                            'italian':'average'}
                   },
             'pork':'bad'}
        }

class grammer_tree:
    graph = None


    def __init__(self):
        self.graph = pydot.Dot(graph_type='graph')

    def draw(self,parent_name, child_name):
        edge = pydot.Edge(parent_name, child_name)
        self.graph.add_edge(edge)

    def visit(self,node, parent=None):  #运用了递归
        for k,v in node.items():
            if isinstance(v, dict):      #是否是叶子节点
                # We start with the root node whose parent is None
                # we don't want to graph the None node
                if parent:
                    self.draw(parent, k)
                self.visit(v, k)
            else:
                if k != '$':   #只画非空元素  $代表一个空节点,可删去,或修改为其他
                    self.draw(parent, k)
                # drawing the label using a distinct name
                #self.draw(k, k+'_'+v)   子结点为空  不用画

    def start(self,dic):

        self.visit(dic)
        # 下面二者根据自己需求使用
        self.graph.write_png('tree.png')  # 最后结果生成png图片格式
        # graph.write_pdf('tree.pdf')  #最后结果生成pdf


if __name__=="__main__":
    photo_draw = grammer_tree()
    photo_draw.start(menu)

调用grammer_tree的类,将字典传入该类的start函数即可使用,并生成对应的png图片或者pdf文件

上面这段程序的运行结果:
程序运行结果
具体的显示结果可根据自己如何构造这个深层嵌套的字典和想要显示的结果来修改

运行时所遇问题的解决办法

关于运行过程中找不到文件和找不到路径的解决办法:页面跳转

关于如何生成深层嵌套的字典的提醒:

上面的visit函数使用了递归的方式来处理一个深层嵌套的字典,在生成一个深层嵌套的字典的时候,也可以用向下递归的方式来生成一个这样的字典

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿,葱来了-C is coming

老板大气

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值