亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python 樹狀嵌套結(jié)構(gòu)的實(shí)現(xiàn)思路

系統(tǒng) 1770 0

原始數(shù)據(jù)

原始數(shù)據(jù)大致是這樣子的:
每條數(shù)據(jù)中的四個(gè)數(shù)據(jù)分別是 當(dāng)前節(jié)點(diǎn)名稱,節(jié)點(diǎn)描述(指代一些需要的節(jié)點(diǎn)屬性),源節(jié)點(diǎn)(即最頂層節(jié)點(diǎn)),父節(jié)點(diǎn)(當(dāng)前節(jié)點(diǎn)上一層節(jié)點(diǎn))。

            
              datas = [
    ["root", "根節(jié)點(diǎn)", "root", None],
    ["node1", "一級節(jié)點(diǎn)1", "root", "root"],
    ["node2", "一級節(jié)點(diǎn)2", "root", "root"],
    ["node11", "二級節(jié)點(diǎn)11", "root", "node1"],
    ["node12", "二級節(jié)點(diǎn)12", "root", "node1"],
    ["node21", "二級節(jié)點(diǎn)21", "root", "node2"],
    ["node22", "二級節(jié)點(diǎn)22", "root", "node2"],
]

            
          

節(jié)點(diǎn)類

抽象封裝出一個(gè)節(jié)點(diǎn)類:

            
              class Node(object):
    def __init__(self, name: str, desc, parent: str, children: list):
        """
        初始化
        :param name:
        :param desc:
        :param parent:
        :param children:
        """
        self.name = name
        self.desc = desc
        self.parent = parent
        self.children = children

    def get_nodes(self):
        """
        獲取該節(jié)點(diǎn)下的全部結(jié)構(gòu)字典
        """
        d = dict()
        d['name'] = self.name
        d['desc'] = self.desc
        d['parent'] = self.parent
        children = self.get_children()
        if children:
            d['children'] = [child.get_nodes() for child in children]
        return d

    def get_children(self):
        """
        獲取該節(jié)點(diǎn)下的全部節(jié)點(diǎn)對象
        """
        return [n for n in nodes if n.parent == self.name]

    def __repr__(self):
        return self.name

            
          

將原始數(shù)據(jù)轉(zhuǎn)換為節(jié)點(diǎn)對象

            
              nodes = list()
for data in datas:
    node = Node(data[0], data[1], data[-1], [])
    nodes.append(node)

            
          

為各個(gè)節(jié)點(diǎn)建立聯(lián)系

            
              for node in nodes:
    children_names = [data[0] for data in datas if data[-1] == node.name]
    children = [node for node in nodes if node.name in children_names]
    node.children.extend(children)

            
          

測試

            
              root = nodes[0]
print(root)

tree = root.get_nodes()
print(json.dumps(tree, indent=4))

            
          

運(yùn)行結(jié)果:
python 樹狀嵌套結(jié)構(gòu)的實(shí)現(xiàn)思路_第1張圖片
原始數(shù)據(jù)也可以是字典的形式:

            
              ### fork_tool.py
import json


class Node(object):
    def __init__(self, **kwargs):
        """
        初始化
        :param nodes: 樹的全部節(jié)點(diǎn)對象
        :param kwargs: 當(dāng)前節(jié)點(diǎn)參數(shù)
        """

        self.forked_id = kwargs.get("forked_id")
        self.max_drawdown = kwargs.get("max_drawdown")
        self.annualized_returns = kwargs.get("annualized_returns")
        self.create_time = kwargs.get("create_time")
        self.desc = kwargs.get("desc")
        self.origin = kwargs.get("origin")
        self.parent = kwargs.get("parent")
        self.children = kwargs.get("children", [])

    def get_nodes(self, nodes):
        """
        獲取該節(jié)點(diǎn)下的全部結(jié)構(gòu)字典,即建立樹狀聯(lián)系
        """
        d = dict()
        d['forked_id'] = self.forked_id
        d['max_drawdown'] = self.max_drawdown
        d['annualized_returns'] = self.annualized_returns
        d['create_time'] = self.create_time
        d['desc'] = self.desc
        d['origin'] = self.origin
        d['parent'] = self.parent
        children = self.get_children(nodes)
        if children:
            d['children'] = [child.get_nodes(nodes) for child in children]
        return d

    def get_children(self, nodes):
        """
        獲取該節(jié)點(diǎn)下的全部節(jié)點(diǎn)對象
        """
        return [n for n in nodes if n.parent == self.forked_id]

    # def __repr__(self):
    #     return str(self.desc)


def process_datas(datas):
    """
    處理原始數(shù)據(jù)
    :param datas:
    :return:
    """
    # forked_infos.append({"forked_id": str(forked_strategy.get("_id")),
    #  "max_drawdown": max_drawdown,
    #  "annualized_returns": annualized_returns,
    #  "create_time": create_time,  # 分支創(chuàng)建時(shí)間
    #  "desc": desc,
    #  "origin": origin,
    #  "parent": parent,
    #  "children": [],
    #  })

    nodes = []
    # 構(gòu)建節(jié)點(diǎn)列表集
    for data in datas:
        node = Node(**data)
        nodes.append(node)

    # 為各個(gè)節(jié)點(diǎn)對象建立類 nosql 結(jié)構(gòu)的聯(lián)系
    for node in nodes:
        children_ids = [data["forked_id"] for data in datas if data["parent"] == node.forked_id]
        children = [node for node in nodes if node.forked_id in children_ids]
        node.children.extend(children)

    return nodes


test_datas = [
    {'annualized_returns': 0.01,
     'children': [],
     'create_time': 1562038393,
     'desc': 'root',
     'forked_id': '5d1ad079e86117f3883f361e',
     'max_drawdown': 0.01,
     'origin': None,
     'parent': None},

    {'annualized_returns': 0.314,
     'children': [],
     'create_time': 1562060612,
     'desc': 'level1',
     'forked_id': '5d1b2744b264566d3f3f3632',
     'max_drawdown': 0.2,
     'origin': '5d1ad079e86117f3883f361e',
     'parent': '5d1ad079e86117f3883f361e'},

    {'annualized_returns': 0.12,
     'children': [],
     'create_time': 1562060613,
     'desc': 'level11',
     'forked_id': '5d1b2745e86117f3883f3632',
     'max_drawdown': None,
     'origin': '5d1ad079e86117f3883f361e',
     'parent': '5d1b2744b264566d3f3f3632'},

    {'annualized_returns': 0.09,
     'children': [],
     'create_time': 1562060614,
     'desc': 'level12',
     'forked_id': '5d1b2746b264566d3f3f3633',
     'max_drawdown': None,
     'origin': '5d1ad079e86117f3883f361e',
     'parent': '5d1b2744b264566d3f3f3632'},

    {'annualized_returns': None,
     'children': [],
     'create_time': 1562060614,
     'desc': 'level2',
     'forked_id': '5d1b2746e86117f3883f3633',
     'max_drawdown': None,
     'origin': '5d1ad079e86117f3883f361e',
     'parent': '5d1ad079e86117f3883f361e'},

    {'annualized_returns': None,
     'children': [],
     'create_time': 1562060627,
     'desc': 'level21',
     'forked_id': '5d1b2753b264566d3f3f3635',
     'max_drawdown': None,
     'origin': '5d1ad079e86117f3883f361e',
     'parent': '5d1b2746e86117f3883f3633'},

    {'annualized_returns': None,
     'children': [],
     'create_time': 1562060628,
     'desc': 'level211',
     'forked_id': '5d1b2754b264566d3f3f3637',
     'max_drawdown': None,
     'origin': '5d1ad079e86117f3883f361e',
     'parent': '5d1b2753b264566d3f3f3635'},

    {'annualized_returns': None,
     'children': [],
     'create_time': 1562060640,
     'desc': 'level212',
     'forked_id': '5d1b2760e86117f3883f3634',
     'max_drawdown': None,
     'origin': '5d1ad079e86117f3883f361e',
     'parent': '5d1b2753b264566d3f3f3635'},
]


if __name__ == "__main__":
    nodes = process_datas(test_datas)
    info = nodes[0].get_nodes(nodes)
    print(json.dumps(info, indent=4))

            
          

更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 九九亚洲综合精品自拍 | 成人性生活免费看 | 久久人人精品 | 亚洲免费三区 | 啪啪99久久综合精品色 | 国产精品欧美亚洲韩国日本不卡 | 国产精品久久久久久久牛牛 | 一级毛片在线视频 | 成人免费观看网站 | 国产性videostv另类极品 | 国产亚洲精品资源一区 | 大胆国模一区二区三区伊人 | 免费一级成人免费观看 | 亚洲精品久久 | 国人精品视频在线观看 | 91综合久久婷婷久久 | 久久中文网中文字幕 | 国产在线98福利播放视频免费 | 日韩一区二区三区在线视频 | 最近中文字幕无免费视频 | 国产区精品福利在线观看精品 | 国产精品久久久视频 | 色婷婷免费视频 | 亚洲系列中文字幕一区二区 | 国产高清自拍 | 国产精品欧美在线 | 免费看欧美一级特黄a毛片 免费看欧美一级特黄α大片 | 亚洲午夜一级毛片 | 四虎国产精品影库永久免费 | 欧美人与鲁交大毛片免费 | 久久99热久久精品在线6 | 欧美日韩毛片 | 亚欧在线精品免费观看一区 | 欧美性色xo影院69 | 精品国产亚洲一区二区三区 | 欧美seav在线 | 日本不卡视频免费 | 精品在线免费视频 | 国产高清在线精品二区一 | 性刺激的欧美三级视频 | 日本中文字幕免费 |