
离线 TA的专栏
- 打卡等级:热心大叔
- 打卡总天数:205
- 打卡月天数:0
- 打卡总奖励:2891
- 最近打卡:2023-08-27 01:44:41
|
python字典生成树状图
- from graphviz import Digraph
- # 获取所有节点中最多子节点的叶节点
- def getMaxLeafs(myTree):
- numLeaf = len(myTree.keys())
- for key, value in myTree.items():
- if isinstance(value, dict):
- sum_numLeaf = getMaxLeafs(value)
- if sum_numLeaf > numLeaf:
- numLeaf = sum_numLeaf
- return numLeaf
- def plot_model(tree, name):
- g = Digraph("G", filename=name, format='png', strict=False)
- first_label = list(tree.keys())[0]
- g.node("0", first_label)
- _sub_plot(g, tree, "0")
- leafs = str(getMaxLeafs(tree) // 10)
- g.attr(rankdir='LR', ranksep=leafs)
- g.view()
- root = "0"
- def _sub_plot(g, tree, inc):
- global root
- first_label = list(tree.keys())[0]
- ts = tree[first_label]
- for i in ts.keys():
- if isinstance(tree[first_label][i], dict):
- root = str(int(root) + 1)
- g.node(root, list(tree[first_label][i].keys())[0])
- g.edge(inc, root, str(i))
- _sub_plot(g, tree[first_label][i], root)
- else:
- root = str(int(root) + 1)
- g.node(root, tree[first_label][i])
- g.edge(inc, root, str(i))
- tree = {
- "tearRate": {
- "reduced": "no lenses",
- "normal": {
- "astigmatic": {
- "yes": {
- "prescript": {
- "myope": "hard",
- "hyper": {
- "age": {
- "young": "hard",
- "presbyopic": "no lenses",
- "pre": "no lenses"
- }
- }
- }
- },
- "no": {
- "age": {
- "young": "soft",
- "presbyopic": {
- "prescript": {
- "myope": "no lenses",
- "hyper": "soft"
- }
- },
- "pre": "soft"
- }
- }
- }
- }
- }
- }
- plot_model(tree, "tree.gv")
复制代码效果如下:
python生成树结构
- # 生成树结构
- def get_trees(data,
- key_column='elementId',
- parent_column='parentId',
- child_column='children'):
- """
- :param data: 数据列表
- :param key_column: 主键字段,默认id
- :param parent_column: 父ID字段名,父ID默认从0开始
- :param child_column: 子列表字典名称
- :return: 树结构
- """
- data_dic = {}
- for d in data:
- data_dic[d.get(key_column)] = d # 以自己的权限主键为键,以新构建的字典为值,构造新的字典
-
- data_tree_list = [] # 整个数据大列表
- for d_id, d_dic in data_dic.items():
- pid = d_dic.get(parent_column) # 取每一个字典中的父id
- if not pid: # 父id=0,就直接加入数据大列表
- data_tree_list.append(d_dic)
- else: # 父id>0 就加入父id队对应的那个的节点列表
- try: # 判断异常代表有子节点,增加子节点列表=[]
- data_dic[pid][child_column].append(d_dic)
- except KeyError:
- data_dic[pid][child_column] = []
- data_dic[pid][child_column].append(d_dic)
- return data_tree_list
-
- def recursion(data, l=None):
- if l is None:
- l = []
- for i in data:
- if 'children' in i:
- children=i.pop('children')
- l.append(i)
- recursion(children,l)
- else:
- l.append(i)
- return l
复制代码以上为个人经验,希望能给大家一个参考,也希望大家多多支持晓枫资讯。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:  进行删除处理。
4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
|