python 字典生成树状图的实例

 更新时间:2022年07月16日 17:08:02   作者:num270710  
这篇文章主要介绍了python 字典生成树状图的实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python 递归式实现二叉树前序,中序,后序遍历

    Python 递归式实现二叉树前序,中序,后序遍历

    这篇文章主要介绍了Python 递归式实现二叉树前序,中序,后序遍历,更多相关资料,需要的小伙伴可以参考下面具体的文章内容
    2022-03-03
  • Python 学习教程之networkx

    Python 学习教程之networkx

    networkx是Python的一个包,用于构建和操作复杂的图结构,提供分析图的算法。对Python networkx相关知识感兴趣的朋友跟随小编一起看看吧
    2019-04-04
  • python按修改时间顺序排列文件的实例代码

    python按修改时间顺序排列文件的实例代码

    这篇文章主要介绍了python按修改时间顺序排列文件的实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-07-07
  • 利用PyQt5+Matplotlib 绘制静态/动态图的实现代码

    利用PyQt5+Matplotlib 绘制静态/动态图的实现代码

    这篇文章主要介绍了利用PyQt5+Matplotlib 绘制静态/动态图的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 重写django的model下的objects模型管理器方式

    重写django的model下的objects模型管理器方式

    这篇文章主要介绍了重写django的model下的objects模型管理器方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • django使用graphql的实例

    django使用graphql的实例

    这篇文章主要介绍了django使用graphql的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Python发送邮件的几种方式(最全总结!)

    Python发送邮件的几种方式(最全总结!)

    发送电子邮件是个很常见的开发需求,平时如果有什么重要的信息怕错过,就可以发个邮件到邮箱来提醒自己,这篇文章主要给大家介绍了关于Python发送邮件的几种方式,需要的朋友可以参考下
    2024-03-03
  • pycharm远程连接服务器运行pytorch的过程详解

    pycharm远程连接服务器运行pytorch的过程详解

    这篇文章主要介绍了在Linux环境下使用Anaconda管理不同版本的Python环境,并通过PyCharm远程连接服务器来运行PyTorch的过程,包括安装PyTorch、CUDA以及配置PyCharm远程开发环境的详细步骤,需要的朋友可以参考下
    2025-02-02
  • Pygame代码 制作一个贪吃蛇小游戏

    Pygame代码 制作一个贪吃蛇小游戏

    这篇文章主要介绍了100行Pygame代码 制作一个贪吃蛇小游戏,相信我们大家都玩过贪吃蛇游戏,今天我们就从头一起来写一个贪吃蛇小游戏,只需要100多行的代码就完成了,需要的朋友可以参考一下
    2021-12-12
  • Python抽象基类的定义与使用方法

    Python抽象基类的定义与使用方法

    这篇文章主要介绍了Python抽象基类的定义与使用方法,Python的抽象基类是指必须让继承它的子类去实现它所要求的抽象方法的类,下面文章内容将详细介绍相关资料,需要的朋友可以参考一下
    2021-10-10

最新评论