简体   繁体   English

树形图打印列表列表

[英]List of lists to Tree Diagram Print

I have a list of lists that make up a tree, similar to a top level directory with a recursive listing of directories and files.我有一个构成树的列表列表,类似于具有目录和文件递归列表的顶级目录。 I want to visualize this as a printed tree.我想把它想象成一棵印刷树。

How can a see a list of lists printed as a tree?如何查看打印为树的列表列表?

Data数据

tree = [
    ['Main University'], 
    ['Main University', 'Academic Affairs'], 
    ['Main University', 'Academic Affairs', 'College of Health Sciences'], 
    ['Main University', 'Academic Affairs', 'College of Arts & Science'], 
    ['Main University', 'Academic Affairs', 'College of Arts & Science', 'Biology'], 
    ['Main University', 'Academic Affairs', 'College of Arts & Science', 'Chemistry/Physics'], 
    ['Main University', 'Academic Affairs', 'College of Arts & Science', 'Chemistry/Physics', 'Physics'], 
    ['Main University', 'Academic Affairs', 'College of Arts & Science', 'Biology', 'Biochemistry & Molecular Bio'], 
    ['Main University', 'Academic Affairs', 'College of Arts & Science', 'Biology', 'Earth Sciences'], 
    ['Main University', 'Academic Affairs', 'College of Arts & Science', 'Biology', 'Environmental Studies'], 
    ['Main University', 'Academic Affairs', 'College of Health Sciences', 'Social Work'], 
    ['Main University', 'Academic Affairs', 'College of Arts & Science', 'Chemistry/Physics', 'Chemistry'], 
    ['Main University', 'Academic Affairs', 'College of Health Sciences', 'Health Sciences'], 
    ['Main University', 'Academic Affairs', 'College of Health Sciences', 'Occupational Therapy']
]

Desired Output (or similar; ie, glyphs like ¦-- , °-- , etc. don't matter)所需的 Output(或类似的;即像¦--°--等字形无关紧要)

Main University                             
 °--Academic Affairs                        
     ¦--College of Arts & Science           
     ¦   ¦--Chemistry/Physics               
     ¦   ¦   ¦--Physics                     
     ¦   ¦   °--Chemistry                   
     ¦   °--Biology                         
     ¦       ¦--Biochemistry & Molecular Bio
     ¦       ¦--Earth Sciences              
     ¦       °--Environmental Studies       
     °--College of Health Sciences          
         ¦--Health Sciences                 
         ¦--Occupational Therapy            
         °--Social Work   

if the array is not too large you can convert it to a tree first then print it如果数组不是太大,您可以先将其转换为树,然后打印

#!/bin/env python3
from collections import OrderedDict

tree = [
    ['Main University'],
    ['Main University', 'Academic Affairs'],
    ['Main University', 'Academic Affairs', 'College of Health Sciences'],
    ['Main University', 'Academic Affairs', 'College of Arts & Science'],
    ['Main University', 'Academic Affairs', 'College of Arts & Science', 'Biology'],
    ['Main University', 'Academic Affairs', 'College of Arts & Science', 'Chemistry/Physics'],
    ['Main University', 'Academic Affairs', 'College of Arts & Science', 'Chemistry/Physics', 'Physics'],
    ['Main University', 'Academic Affairs', 'College of Arts & Science', 'Biology', 'Biochemistry & Molecular Bio'],
    ['Main University', 'Academic Affairs', 'College of Arts & Science', 'Biology', 'Earth Sciences'],
    ['Main University', 'Academic Affairs', 'College of Arts & Science', 'Biology', 'Environmental Studies'],
    ['Main University', 'Academic Affairs', 'College of Health Sciences', 'Social Work'],
    ['Main University', 'Academic Affairs', 'College of Arts & Science', 'Chemistry/Physics', 'Chemistry'],
    ['Main University', 'Academic Affairs', 'College of Health Sciences', 'Health Sciences'],
    ['Main University', 'Academic Affairs', 'College of Health Sciences', 'Occupational Therapy']
]

class Tree:
    def __init__(self, data):
        self.data = data
        self.children = OrderedDict()

    def add_array(self, obj):
        if obj:
            if obj[0] not in self.children:
                self.children[obj[0]] = Tree(obj[0])
            self.children[obj[0]].add_array(obj[1:])

    def print_tree(self, l):
        s = " " * l * 4 + self.data + "\n"
        for x in self.children.values():
            s += x.print_tree(l+1)

        return s

    def __repr__(self):
        return self.print_tree(0)



root = Tree("root")
for x in tree:
    root.add_array(x)

print(root)

prints out the following打印出以下内容

root
    Main University
        Academic Affairs
            College of Health Sciences
                Social Work
                Health Sciences
                Occupational Therapy
            College of Arts & Science
                Biology
                    Biochemistry & Molecular Bio
                    Earth Sciences
                    Environmental Studies
                Chemistry/Physics
                    Physics
                    Chemistry

The bigtree package can do this nicely: bigtree package可以很好地做到这一点:

from bigtree import list_to_tree, print_tree
path_list = ['/'.join(x) for x in tree]
root = list_to_tree(path_list)
print_tree(root)

Yields:产量:

Main University
└── Academic Affairs
    ├── College of Health Sciences
    │   ├── Social Work
    │   ├── Health Sciences
    │   └── Occupational Therapy
    └── College of Arts & Science
        ├── Biology
        │   ├── Biochemistry & Molecular Bio
        │   ├── Earth Sciences
        │   └── Environmental Studies
        └── Chemistry
            └── Physics
                ├── Physics
                └── Chemistry

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM