Python:从嵌套结构扁平列表生成按字母排序的索引
解决方案
核心思路
可以用字典树(Trie)+递归遍历的方式解决,步骤清晰且通用,完全支持无序输入、任意层级词汇的场景:
- 把所有路径拆解成层级,构建一棵嵌套字典树,每个节点的子节点用字典存储;
- 对字典树每一层的子节点按字母排序,保证编号顺序符合要求;
- 递归遍历字典树,给每个路径分配对应的层级编号,并存入映射表;
- 最后根据原输入列表,从映射表中取出每个路径对应的编号,得到结果。
具体实现(Python)
def build_trie(paths): trie = {} for path in paths: nodes = path.split('/') current = trie for node in nodes: if node not in current: current[node] = {} current = current[node] return trie def sort_trie(trie): # 递归排序每一层的子节点 for key in trie: sort_trie(trie[key]) # 按字母顺序重新排列子节点 sorted_keys = sorted(trie.keys()) return {key: trie[key] for key in sorted_keys} def generate_number_map(trie, prefix='', number_map=None): if number_map is None: number_map = {} # 处理当前层级的节点 for idx, key in enumerate(trie.keys(), 1): current_number = f"{prefix}.{idx}" if prefix else str(idx) # 拼接当前路径 current_path = f"{prefix.replace('.', '/')}/{key}" if prefix else key number_map[current_path] = current_number # 递归处理子节点 generate_number_map(trie[key], current_number, number_map) return number_map def path_to_index(paths): # 构建字典树 trie = build_trie(paths) # 排序字典树各层级 sorted_trie = sort_trie(trie) # 生成路径到编号的映射 num_map = generate_number_map(sorted_trie) # 按原输入顺序返回对应的编号 return [num_map[path] for path in paths] # 测试示例 input_paths = ['a','a/b','a/b/a','a/c','a/c/a','b'] output = path_to_index(input_paths) print(output) # 输出: ['1', '1.1', '1.1.1', '1.2', '1.2.1', '2']
关键点说明
- 字典树构建:不管输入路径是否有序,都能完整记录所有层级结构,不会遗漏任何节点;
- 层级排序:递归对每个节点的子节点按字母排序,确保编号是按字母顺序分配的;
- 递归生成编号:遍历过程中记录当前层级的编号前缀,子节点编号在前缀基础上追加序号,自然形成
1.1、1.1.1这类层级编号; - 映射表匹配:最后直接通过映射表快速查找原输入路径对应的编号,保证输出顺序和原输入一致。
适配任意场景的特性
- 支持无序输入:不管原列表的路径顺序如何,字典树都会完整构建,排序后生成正确编号;
- 支持任意词汇层级:只要路径用
/分隔,不管层级是字母、数字还是其他字符串,都能正确处理; - 支持任意深度层级:递归逻辑可以处理无限嵌套的路径结构。
内容的提问来源于stack exchange,提问作者Kspr
相关产品推荐
相关产品推荐

