IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python 根据父子信息 还原成json树 -> 正文阅读

[Python知识库]python 根据父子信息 还原成json树

根据父子信息 还原成json树
需求

有一组数据 ([1,2], [2, 3], [1, 5], [5, 6]), 列表里的数据分别为父节点,子节点。将这组数据还原成树状json数据。

代码

定义一个Node对象

import json
from collections import defaultdict


class Node:
    def __init__(self, key, info):
        self.key = key
        self.info = info
        self.children = []

    def to_dict(self):
        result = dict()
        result["key"] = self.key

        for _k, _v in self.info.items():
            result[_k] = _v
        # 递归生成字典
        result["children"] = [x.to_dict() for x in self.children]
        return result
class TreeProcessor:
    def __init__(self, pair: list, info: dict, d_type="json"):
        """

        :param pair: [(0, 1), (0, 2)...] 父子关系对
        :param info: {0 : {"name": xxx}} 每个节点的详细信息
        :param d_type: 返回类型 json dict
        """
        self._pair = pair
        self._info = info
        self.d_type = d_type
        self.root_id, self._pair_map, self._ids = self._process_data()

    def _process_data(self):
        """
        将[(0, 1), (0, 2)...] 父子关系对
        变为 {father: [child, child]}
        :return:
        """
        pair_map = defaultdict(list)
        ids = set()
        fathers = set()
        children = set()
        for f, s in self._pair:
            ids.add(f)
            ids.add(s)
            fathers.add(f)
            children.add(s)
            pair_map[f].append(s)
        root_id = fathers - children
        root_id = list(root_id)[0] if root_id else None
        return root_id, pair_map, ids

    def _create_nodes(self):
        return {x: Node(x, self._info.get(x, {})) for x in self._ids}

    @property
    def tree(self):
        node_map = self._create_nodes()
        for k, v in self._pair_map.items():
            node_map[k].children = [node_map[i] for i in v]
        root_node: Node = node_map.get(self.root_id)

        tree_res = json.dumps(root_node.to_dict()) if self.d_type == 'json' else root_node.to_dict()
        return tree_res
结果
infos = {0: {"name": "zero", "alias": "ling"},
             1: {"name": "one", "alias": "yi"},
             2: {"name": "two", "alias": "er"},
             3: {"name": "three", "alias": "san"},
             4: {"name": "four", "alias": "si"},
             5: {"name": "five", "alias": "wu"},
             6: {"name": "six", "alias": "liu"},
             7: {"name": "seven", "alias": "qi"}}
relation = [(0, 1),
            (0, 2),
            (0, 3),
            (2, 4),
            (2, 5),
            (5, 6),
            (5, 7)]
tp = TreeProcessor(relation, infos)
tree_dict = tp.tree
print(tree_dict)

tree json

{
    "key": 0,
    "name": "zero",
    "alias": "ling",
    "children": [
        {
            "key": 1,
            "name": "one",
            "alias": "yi",
            "children": []
        },
        {
            "key": 2,
            "name": "two",
            "alias": "er",
            "children": [
                {
                    "key": 4,
                    "name": "four",
                    "alias": "si",
                    "children": []
                },
                {
                    "key": 5,
                    "name": "five",
                    "alias": "wu",
                    "children": [
                        {
                            "key": 6,
                            "name": "six",
                            "alias": "liu",
                            "children": []
                        },
                        {
                            "key": 7,
                            "name": "seven",
                            "alias": "qi",
                            "children": []
                        }
                    ]
                }
            ]
        },
        {
            "key": 3,
            "name": "three",
            "alias": "san",
            "children": []
        }
    ]
}
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-02-16 13:02:46  更:2022-02-16 13:05:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 23:36:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码