Python:如何为扁平嵌套结构列表生成层级索引字符串?
实现扁平嵌套路径的层级索引生成
核心思路
用一个字典跟踪每个父路径对应的下一个子节点序号,确保同层级节点按输入顺序递增编号。对每个路径拆分层级后,从根节点开始逐层推导当前节点的序号,最终拼接成要求的索引字符串。
具体步骤
- 初始化计数字典:用空字符串代表根节点的父路径,初始计数设为1(根节点序号从1开始)。
- 逐个处理路径:
- 把当前路径按
/拆分成层级列表,比如apple/dog/banana拆成['apple', 'dog', 'banana']。 - 从根节点开始,逐步构建父路径:处理第一个层级时父路径是空字符串;处理后续层级时,父路径是前n个层级拼接成的完整路径。
- 从计数字典中取出父路径对应的当前序号,将其加入当前索引的列表中,随后把父路径的计数加1(供下一个同层级节点使用)。
- 把当前节点的完整路径加入计数字典(若尚未存在),初始计数设为1,方便它的子节点调用。
- 把当前路径按
- 收集结果:把每个路径的层级序号用
.拼接成字符串,存入结果列表。
代码示例(Python)
def generate_indexes(paths): counter = {'': 1} # 空字符串对应根节点的父路径,初始序号从1开始 indexes = [] for path in paths: parts = path.split('/') current_index_parts = [] parent_path = '' for part in parts: # 获取当前层级的序号 current_seq = counter[parent_path] current_index_parts.append(str(current_seq)) # 更新父路径的计数,下一个同层级节点序号+1 counter[parent_path] += 1 # 构建当前节点的完整路径,作为下一级的父路径 parent_path = f"{parent_path}/{part}" if parent_path else part # 初始化当前节点的子节点计数(如果还没初始化) if parent_path not in counter: counter[parent_path] = 1 # 拼接成最终的索引字符串 indexes.append('.'.join(current_index_parts)) return indexes # 测试示例输入 input_paths = ['apple', 'apple/dog', 'apple/dog/banana', 'apple/dog/apple', 'apple/cat', 'cold', 'cold/banana'] print(generate_indexes(input_paths)) # 输出结果:['1', '1.1', '1.1.1', '1.1.2', '1.2', '2', '2.1']
注意事项
- 输入列表必须保证父路径出现在子路径之前,比如
apple必须在apple/dog前面,否则会因为父路径不在计数字典里抛出KeyError。如果要处理乱序的输入,可以先按路径的层级长度(split('/')后的元素个数)从小到大排序,再进行处理。 - 路径里的层级名称不影响索引生成,只按输入顺序计数。
内容的提问来源于stack exchange,提问作者Kspr
相关产品推荐
相关产品推荐

