设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间09 现在时间09 缓存数据 随缘不是听天由命,而是用豁达的心态去面对生活。心累的时候,不如换个角度看世界。新的一天,早安。

随缘不是听天由命,而是用豁达的心态去面对生活。心累的时候,不如换个角度看世界。新的一天,早安。

查看: 363|回复: 1

python 字典生成树状图的实例

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:205
  • 打卡月天数:0
  • 打卡总奖励:2891
  • 最近打卡:2023-08-27 01:44:41
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
398
主题
362
精华
0
金钱
4059
积分
776
注册时间
2022-12-21
最后登录
2025-5-31

发表于 2023-2-10 23:33:55 | 显示全部楼层 |阅读模式
python字典生成树状图
  1. from graphviz import Digraph

  2. # 获取所有节点中最多子节点的叶节点
  3. def getMaxLeafs(myTree):
  4.     numLeaf = len(myTree.keys())
  5.     for key, value in myTree.items():
  6.         if isinstance(value, dict):
  7.             sum_numLeaf = getMaxLeafs(value)
  8.             if sum_numLeaf > numLeaf:
  9.                 numLeaf = sum_numLeaf
  10.     return numLeaf

  11. def plot_model(tree, name):
  12.     g = Digraph("G", filename=name, format='png', strict=False)
  13.     first_label = list(tree.keys())[0]
  14.     g.node("0", first_label)
  15.     _sub_plot(g, tree, "0")
  16.     leafs = str(getMaxLeafs(tree) // 10)
  17.     g.attr(rankdir='LR', ranksep=leafs)
  18.     g.view()

  19. root = "0"


  20. def _sub_plot(g, tree, inc):
  21.     global root

  22.     first_label = list(tree.keys())[0]
  23.     ts = tree[first_label]
  24.     for i in ts.keys():
  25.         if isinstance(tree[first_label][i], dict):
  26.             root = str(int(root) + 1)
  27.             g.node(root, list(tree[first_label][i].keys())[0])
  28.             g.edge(inc, root, str(i))
  29.             _sub_plot(g, tree[first_label][i], root)
  30.         else:
  31.             root = str(int(root) + 1)
  32.             g.node(root, tree[first_label][i])
  33.             g.edge(inc, root, str(i))

  34. tree = {
  35.         "tearRate": {
  36.             "reduced": "no lenses",
  37.             "normal": {
  38.                 "astigmatic": {
  39.                     "yes": {
  40.                         "prescript": {
  41.                             "myope": "hard",
  42.                             "hyper": {
  43.                                 "age": {
  44.                                     "young": "hard",
  45.                                     "presbyopic": "no lenses",
  46.                                     "pre": "no lenses"
  47.                                 }
  48.                             }
  49.                         }
  50.                     },
  51.                     "no": {
  52.                         "age": {
  53.                             "young": "soft",
  54.                             "presbyopic": {
  55.                                 "prescript": {
  56.                                     "myope": "no lenses",
  57.                                     "hyper": "soft"
  58.                                 }
  59.                             },
  60.                             "pre": "soft"
  61.                         }
  62.                     }
  63.                 }
  64.             }
  65.         }
  66.     }
  67. plot_model(tree, "tree.gv")
复制代码
效果如下:
003520jtaizv9fdlkdtdiv.png


python生成树结构
  1. # 生成树结构
  2. def get_trees(data,
  3.               key_column='elementId',
  4.               parent_column='parentId',
  5.               child_column='children'):
  6.     """
  7.     :param data: 数据列表
  8.     :param key_column: 主键字段,默认id
  9.     :param parent_column: 父ID字段名,父ID默认从0开始
  10.     :param child_column: 子列表字典名称
  11.     :return: 树结构
  12.     """
  13.     data_dic = {}
  14.     for d in data:
  15.         data_dic[d.get(key_column)] = d  # 以自己的权限主键为键,以新构建的字典为值,构造新的字典

  16.     data_tree_list = []  # 整个数据大列表
  17.     for d_id, d_dic in data_dic.items():
  18.         pid = d_dic.get(parent_column)  # 取每一个字典中的父id
  19.         if not pid:  # 父id=0,就直接加入数据大列表
  20.             data_tree_list.append(d_dic)
  21.         else:  # 父id>0 就加入父id队对应的那个的节点列表
  22.             try:  # 判断异常代表有子节点,增加子节点列表=[]
  23.                 data_dic[pid][child_column].append(d_dic)
  24.             except KeyError:
  25.                 data_dic[pid][child_column] = []
  26.                 data_dic[pid][child_column].append(d_dic)
  27.     return data_tree_list

  28. def recursion(data, l=None):
  29.     if l is None:
  30.         l = []
  31.     for i in data:
  32.         if 'children' in i:
  33.             children=i.pop('children')
  34.             l.append(i)
  35.             recursion(children,l)
  36.         else:
  37.             l.append(i)
  38.     return l
复制代码
以上为个人经验,希望能给大家一个参考,也希望大家多多支持晓枫资讯。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
17
积分
14
注册时间
2022-12-27
最后登录
2022-12-27

发表于 3 天前 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表