如何将层级化产品分类列表转换为Python字典
层级分类列表转指定结构Python字典
需求说明
把一组层级化的产品分类列表,转换成嵌套字典与列表混合结构的Python字典,规则是:每个分类的最后一级子项以列表形式存储,上层分类以字典形式嵌套。
输入示例(中文翻译后)
['畜牧产品'] ['畜牧产品', '家禽'] ['畜牧产品', '家禽', '鸡'] ['畜牧产品', '反刍动物'] ['畜牧产品', '反刍动物', '山羊'] ['畜牧产品', '反刍动物', '奶牛'] ['食品杂货'] ['食品杂货', '食品储藏柜'] ['食品杂货', '食品储藏柜', '罐装/瓶装食品'] ['食品杂货', '食品储藏柜', '罐装/瓶装食品', '汤类'] ['食品杂货', '食品储藏柜', '罐装/瓶装食品', '蔬菜']
期望输出结构(中文翻译后)
{ '畜牧产品': { '家禽': ['鸡'], '反刍动物': ['山羊', '奶牛'] }, '食品杂货':{ '食品储藏柜': { '罐装/瓶装食品': ['汤类', '蔬菜'] } } }
实现代码
def build_category_tree(categories): tree = {} for path in categories: current = tree # 处理仅含顶层分类的路径 if len(path) == 1: if path[0] not in current: current[path[0]] = {} continue # 遍历到倒数第二个节点的父层级,确保字典结构存在 for node in path[:-2]: if node not in current: current[node] = {} current = current[node] # 处理倒数第二个节点(父节点)和最后一个节点(叶子项) parent_node = path[-2] leaf_node = path[-1] # 初始化父节点对应的列表(若不存在) if parent_node not in current: current[parent_node] = [] # 避免重复添加叶子项 if leaf_node not in current[parent_node]: current[parent_node].append(leaf_node) return tree # 测试用例 categories = [ ['畜牧产品'], ['畜牧产品', '家禽'], ['畜牧产品', '家禽', '鸡'], ['畜牧产品', '反刍动物'], ['畜牧产品', '反刍动物', '山羊'], ['畜牧产品', '反刍动物', '奶牛'], ['食品杂货'], ['食品杂货', '食品储藏柜'], ['食品杂货', '食品储藏柜', '罐装/瓶装食品'], ['食品杂货', '食品储藏柜', '罐装/瓶装食品', '汤类'], ['食品杂货', '食品储藏柜', '罐装/瓶装食品', '蔬菜'] ] # 打印结果 import pprint result = build_category_tree(categories) pprint.pprint(result)
代码逻辑说明
- 初始化空字典作为分类树的根节点;
- 遍历每个分类路径:
- 若路径仅含一个元素(顶层分类),直接在根字典中创建该分类对应的空字典;
- 若路径长度大于1,先遍历到倒数第二个节点的父层级,确保每个中间节点都以字典形式存在;
- 将倒数第二个节点作为父节点,初始化其对应的列表(若未创建),再将最后一个节点作为叶子项加入列表,同时避免重复添加;
- 最终返回构建好的分类树字典。
内容的提问来源于stack exchange,提问作者0n10n_
相关产品推荐
相关产品推荐

