python中用字典写出树形数据结构并在控制台中打印树形数据结构

Python018

python中用字典写出树形数据结构并在控制台中打印树形数据结构,第1张

#!/usr/bin/python3

# -*- coding: utf-8 -*-

def print_tree(tree):

    buff = ['ROOT/']

    _print_tree(tree, buff, '', 0)

    print('\n'.join(buff))

def _print_tree(tree, buff, prefix, level):

    count = len(tree)

    for k, v in tree.items():

        count -= 1

        if v:

            buff.append('%s +- %s/' % (prefix, k))

            if count > 0:

                _print_tree(v, buff, prefix + ' |  ', level + 1)

            else:

                _print_tree(v, buff, prefix + '    ', level + 1)

        else:

            buff.append('%s +- %s' % (prefix, k))

def test():

    tree = {

        'bin': { 'bash': None, 'cat': None, 'cp': None, },

        'etc': {

            'init.d': { 'apache2':None, 'slapd':None, 'sshd':None, },

            'passwd': None,

            'hosts': None,

        },

        'var': {

            'log': {

                'apache2': { 'accesslog':None, 'errorlog': None, },

            },

        },

    }

    print_tree(tree)

if __name__ == '__main__':

    test()

输出结果:

ROOT/

 +- etc/

 |   +- passwd

 |   +- init.d/

 |   |   +- apache2

 |   |   +- sshd

 |   |   +- slapd

 |   +- hosts

 +- bin/

 |   +- cp

 |   +- bash

 |   +- cat

 +- var/

     +- log/

         +- apache2/

             +- errorlog

             +- accesslog

那么如何做到溯源,要求docker file中From 或者Label字段上记录该image的上游。如果能保证按照这条规则执行,那么我们会得到类似于这样的信息:

继续思考:观察数据会发现好多image会有同样的base image,那么针对这些image,我们需要将他们归并到一条分支上。或者说要找出他们的祖先,将他们归并道对应的祖先分支上。那么思想和树很像了,决定用树形结构来处理。

简化抽象需求,画出简图如下:

使用python treelib模块构造多叉树:

将每一层的树节点的id,编为child1,child11...child2,child22...同一层后缀数字一样,个数不一样,不同层数字不一样,以此类推。这样的好处就是我能根据节点ID,就知道它属于第几层。