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