Skip to main content
 首页 » 编程设计

python之具有深度值的镜像列表,到嵌套列表 ~ Python

2025年05月04日35arxive

我打算自动化装配过程,并尝试构建 C4D Python 脚本。我正在尝试将基于深度值的列表镜像到嵌套列表。

假设我们有一个包含深度值的列表:

depth_list = [[0,'Hips'],[1,'Spine'],[2,'Spine1'],[3,'Spine2'],[4,'Neck'],[5,'Head'],[6,'HeadTop_End'],[4,'LeftShoulder']] 

我们希望这个成为一个基于深度值的嵌套联合列表:

joint_list = [['Hips',['Spine',['Spine1',['Spine2',['Neck',['Head',['HeadTop_End']]],['LefShoulder']]]]]] 

我已经走了这么远:

for joint in depth_list: 
    this_depth = joint[0] 
    try: 
        joint_list.append(0) 
    except IndexError: 
        pass 

这是我从 C4D 树导出脚本中得到的原始数据

0  Hips 
1      Spine 
2          Spine1 
3              Spine2 
4                  Neck 
5                      Head 
6                          HeadTop_End 
4                  LeftShoulder 

这是一张图片:

[![enter image description here][1]][1]

祝大家一千万快乐!

请您参考如下方法:

您可以递归地执行此操作,如下所示:

depth_list = [[0,'Hips'],[1,'Spine'],[2,'Spine1'],[3,'Spine2'],[4,'Neck'],[5,'Head'],[6,'HeadTop_End'],[4,'LeftShoulder']] 
 
def construct(depth_list, current_level=0): 
    output = [] 
    while len(depth_list) > 0: 
        new_level, new_name = depth_list[0] 
 
        if new_level == current_level: 
            output.append([new_name]) 
            depth_list.pop(0) 
        elif new_level > current_level: 
            child = construct(depth_list, new_level) 
            output[-1].extend(child) 
        else: 
            return output 
 
  return output 
 
print(construct(depth_list)) 

基本思想是递归遍历输入列表。每次遇到元素时,您都会做以下三件事之一:

  1. 如果关节处于同一层级,则从 depth_list 中移除关节并将其添加到输出(包含当前层级的所有关节)。
  2. 如果关节更深一层,则不要修改depth_list,而是递归获取子树。然后,将该树添加到输出列表中的最后一个元素,即当前关节。 (递归调用还将从 depth_list 中删除正确数量的元素)。
  3. 如果它处于较浅的层次,则放弃并返回,让父级继续循环 depth_list 的剩余部分。

请注意,此函数是破坏性的 - 一旦函数完成,它将使 depth_list 完全为空。如果要保留它,请在调用函数之前复制列表:

copy = list(depth_list) 
print(construct(copy))