Python 3.x 打印分层树的编号轮廓

Python 3.x 打印分层树的编号轮廓,python-3.x,blender,Python 3.x,Blender,我正试图编写一个函数来打印一个对象层次结构树(在Blender 3D中,但这是一个一般的Python问题),并使用十进制轮廓编号 我要求: 带有任何符号的可选缩进,如“+”或“--”或无缩进”,以及 可选地将“.0”附加到具有子节点的节点,以区分分支和叶 例如,在Blender中,我创建了一个带有骨骼的电枢,层次结构如下: + Life ++ Bacteria ++ Eukaryota +++ plants +++ animals ++++ Vertebrates +++++ amphibi

我正试图编写一个函数来打印一个对象层次结构树(在Blender 3D中,但这是一个一般的Python问题),并使用十进制轮廓编号

我要求:

  • 带有任何符号的可选缩进,如
    “+”
    “--”
    或无缩进
    ,以及
  • 可选地将
    “.0”
    附加到具有子节点的节点,以区分分支和叶
例如,在Blender中,我创建了一个带有骨骼的电枢,层次结构如下:

+ Life
++ Bacteria
++ Eukaryota
+++ plants
+++ animals
++++ Vertebrates
+++++ amphibians
+++++ reptiles
+++++ mammals
>>> def print_hierarchy(obj, prefix = ''):
        print('{}{} {}'.format(prefix, '.0' if obj.children else '', obj.name))
        for num, child in enumerate(obj.children, 1):
            print_hierarchy(child, '    {}.{}'.format(prefix, num))

>>> print_hierarchy(root, '1')
1.0 Life
    1.1 Bacteria
    1.2.0 Eukaryota
        1.2.1 plants
        1.2.2.0 animals
            1.2.2.1.0 Vertebratens
                1.2.2.1.1 amphibians
                1.2.2.1.2 reptiles
                1.2.2.1.3 mammals
在de文本编辑器中,我创建了以下基本脚本:

import bpy
D = bpy.data
root = D.armatures['Armature'].bones['Life']

def print_hierarchy(obj, indent = "+"):
    print(indent, obj.name)
    for child in obj.children:
        print_hierarchy(child, indent+"+")
print_hierarchy(root)
此脚本输出:

+ Life
++ Bacteria
++ Eukaryota
+++ plants
+++ animals
++++ Vertebrates
+++++ amphibians
+++++ reptiles
+++++ mammals
我希望它看起来像这样

1.0 Life
    1.1 Bacteria
    1.2.0 Eukaryota
        1.2.1 plants
        1.2.2.0 animals
            1.2.2.1.0 Vertebrates
                1.2.2.1.1 amphibians
                1.2.2.1.2 reptiles
                1.2.2.1.3 mammals
我已经修改了(递归)函数
print\u hierarchy()
,但每次我尝试向它添加新内容时,它都会崩溃。我想不通,所以我需要一些帮助


对于这类事情,while循环比递归函数更好/更有效/更快吗?

这样做会更容易,例如

1 Life
    1.1 Bacteria
    1.2 Eukaryota
        1.2.1 plants
        1.2.2 animals
              1.2.2.1 Vertebrates
              1.2.2.1.1 amphibians
              1.2.2.1.2 reptiles
              1.2.2.1.3 mammals
这样,您就不必显式地检查节点是否有子节点来打印它了。一些有用的代码:

for index, child in enumerate(obj.children, 1):
这将使用基于一的索引对每个
子项进行编号

''.join(('\t', indent, '.', str(index)))
将新选项卡添加到上一个
缩进
的开头,并将
索引
添加到结尾。综上所述:

def print_hierarchy(root, indent="1"):
    print('\t'.join([indent, root.name]))
    for index, child in enumerate(root.children, 1):
        print_hierarchy(child, ''.join(('\t', indent, '.', str(index))))
我得到:

1   life
    1.1 bacteria
    1.2 eukaryota
        1.2.1   plants
        1.2.2   animals
            1.2.2.1 vertebrates
                1.2.2.1.1   amphibians
                1.2.2.1.2   reptiles
                1.2.2.1.3   mammals
为了实现更全面的功能,它变得更复杂:

def print_hierarchy(root, indent=None, dec=None, zeroes=False):
    if indent is None:
        indent = []
    elif isinstance(indent, str):
        indent = [indent]
    if dec is None:
        dec = []
        zeroes = False
    elif isinstance(dec, int):
        dec = [str(dec)]
    elif isinstance(dec, str):
        dec = [dec]
    print(' '.join([''.join(indent), 
                    '.'.join(dec + ["0"] if root.children and zeroes else dec), 
                    root.name]))
    for index, child in enumerate(root.children, 1):
        print_hierarchy(child, 
                        indent + [indent[0]] if indent else indent, 
                        dec + [str(index)] if dec else dec,
                        zeroes)

print_hierarchy(root, "\t", 1, True)

您可以这样更改递归函数:

+ Life
++ Bacteria
++ Eukaryota
+++ plants
+++ animals
++++ Vertebrates
+++++ amphibians
+++++ reptiles
+++++ mammals
>>> def print_hierarchy(obj, prefix = ''):
        print('{}{} {}'.format(prefix, '.0' if obj.children else '', obj.name))
        for num, child in enumerate(obj.children, 1):
            print_hierarchy(child, '    {}.{}'.format(prefix, num))

>>> print_hierarchy(root, '1')
1.0 Life
    1.1 Bacteria
    1.2.0 Eukaryota
        1.2.1 plants
        1.2.2.0 animals
            1.2.2.1.0 Vertebratens
                1.2.2.1.1 amphibians
                1.2.2.1.2 reptiles
                1.2.2.1.3 mammals
但我同意jonrsharpe的观点,即编号对于等级制度来说并没有真正意义。这使得
生命
细菌
似乎处于同一水平,但
真核生物
则不是。

您可以使用
枚举(seq,1)
使索引从
1
开始,而不是
0