You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将带项目符号的线性字典列表转换为层级嵌套结构?

问题:将层级项目符号列表转换为指定嵌套字典列表格式

我需要把带有层级项目符号的文档内容转换为特定的嵌套字典列表格式,原始层级结构示例如下:

<ul>
<li>First bullet
<ul>
<li>first subbullet of bullet 1</li>
</ul>
</li>
<li>Second bullet
<ul>
<li>first subbullet of bullet 2
<ul>
<li>first subbullet of subbullet 1 of bullet 2</li>
</ul>
</li>
</ul>
</li>
</ul>

期望转换后的目标格式:

tags: [
    {
        "tag": "bulletlist",
        "bullets": [
            {
                "text": "First bullet",
                "level": 1,
                "subbullets": [
                    {
                        "text": "first subbullet of bullet 1",
                        "level": 2,
                        "subbullets": []
                    }
                ]
            },
            {
                "text": "Second bullet",
                "level": 1,
                "subbullets": [
                    {
                        "text": "first subbullet of bullet 2",
                        "level": 2,
                        "subbullets": [
                            {
                                "text": "first subbullet of subbullet 1 of bullet 2",
                                "level": 3,
                                "subbullets": []
                            }
                        ]
                    }
                ]
            }
        ]
    }
]

现有代码问题

我之前编写的TreeNode类生成的输出不符合预期,原代码及输出如下:

原代码

import json

class TreeNode:

    def __init__(self, number, name, subullet):
        self.number = number
        self.text = name
        self.subullet=subullet
        self.children = []
    
    def addChild(self, child):
        self.children.append(child)
    
    def serialize(self):
        s={}
        for child in self.children:
            
            s["text"] = self.text
            s["level"] = self.number
            s[child.subullet] = child.serialize()
            
        return s

root=TreeNode("","root","bullets")

element1=TreeNode("1","First bullet","bullet1")
element2=TreeNode("2","Second bullet","bullet2")

root.addChild(element1)
root.addChild(element2)


child1_element1=TreeNode("1.1","first subbullet of bullet 1","bullet 1.1")
child2_element2=TreeNode("1.2","first subbullet of bullet 2","bullet 2.1")
child1_child2=TreeNode("1.2","first subbullet of subbullet 1 of bullet 2","bullet 2.1.1.")


element1.addChild(child1_element1)
element2.addChild(child2_element2)
child2_element2.addChild(child1_child2)

end=TreeNode(None,None,None)
child1_element1.addChild(end)
child1_child2.addChild(end)

print(json.dumps(root.serialize(), indent=4)) 

原输出

{
    "text": "root",
    "level": "",
    "bullet1": {
        "text": "First bullet",
        "level": "1",
        "bullet 1.1": {
            "text": "first subbullet of bullet 1",
            "level": "1.1",
            "null": {}
        }
    },
    "bullet2": {
        "text": "Second bullet",
        "level": "2",
        "bullet 2.1": {
            "text": "first subbullet of bullet 2",
            "level": "1.2",
            "bullet 2.1.1.": {
                "text": "first subbullet of subbullet 1 of bullet 2",
                "level": "1.2",
                "null": {}
            }
        }
    }
}

解决方案

核心问题在于原TreeNode的serialize方法逻辑错误,未正确生成列表形式的子项目,且误用自定义标签作为键。修改后的实现如下:

修改后的代码

import json

class TreeNode:
    def __init__(self, level, text):
        self.level = int(level)  # 层级转为整数,确保格式统一
        self.text = text
        self.children = []
    
    def add_child(self, child):
        self.children.append(child)
    
    def serialize(self):
        # 固定生成目标格式的核心字段
        result = {
            "text": self.text,
            "level": self.level,
            "subbullets": []
        }
        # 递归序列化所有子节点,添加到subbullets列表
        for child in self.children:
            result["subbullets"].append(child.serialize())
        return result

# 构建最终的标签结构
root_bullet_list = {
    "tag": "bulletlist",
    "bullets": []
}

# 创建层级节点
bullet1 = TreeNode(1, "First bullet")
bullet2 = TreeNode(1, "Second bullet")
root_bullet_list["bullets"].extend([bullet1, bullet2])

subbullet1_1 = TreeNode(2, "first subbullet of bullet 1")
subbullet2_1 = TreeNode(2, "first subbullet of bullet 2")
bullet1.add_child(subbullet1_1)
bullet2.add_child(subbullet2_1)

subsubbullet2_1_1 = TreeNode(3, "first subbullet of subbullet 1 of bullet 2")
subbullet2_1.add_child(subsubbullet2_1_1)

# 生成最终输出格式
final_output = {
    "tags": [root_bullet_list]
}

print(json.dumps(final_output, indent=4))

正确输出

{
    "tags": [
        {
            "tag": "bulletlist",
            "bullets": [
                {
                    "text": "First bullet",
                    "level": 1,
                    "subbullets": [
                        {
                            "text": "first subbullet of bullet 1",
                            "level": 2,
                            "subbullets": []
                        }
                    ]
                },
                {
                    "text": "Second bullet",
                    "level": 1,
                    "subbullets": [
                        {
                            "text": "first subbullet of bullet 2",
                            "level": 2,
                            "subbullets": [
                                {
                                    "text": "first subbullet of subbullet 1 of bullet 2",
                                    "level": 3,
                                    "subbullets": []
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

关键修改说明

  1. 简化TreeNode结构:去掉冗余的subullet参数,只保留level(整数类型)和text两个核心属性
  2. 固定序列化字段:serialize方法统一生成text、level、subbullets三个字段,其中subbullets是子节点序列化后的列表
  3. 移除无效节点:无需添加空的"end"节点,没有子节点时subbullets自动为空列表

内容的提问来源于stack exchange,提问作者Hassaan Alraee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:15:30