理想结果
自己创建的一个字典,然后根据字典画出的语法树:
代码及使用提醒
封装的类的使用:
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函数使用了递归的方式来处理一个深层嵌套的字典,在生成一个深层嵌套的字典的时候,也可以用向下递归的方式来生成一个这样的字典