为标题列表赋予层次结构

问题描述 投票:0回答:1

我在 python 中有这个列表

titles = [
    '13.3. Risk',
    '13.3.1. Strategy',
    'SubStrategy',
    '13.3.2. Token',
    'Material',
    'Impact',
    'Aling'
]

我想创建层次结构,结果如下:

|_'13.3. Risk'
   |____'13.3.1. Strategy' 
   |     |____'SubStrategy' 
   |____'13.3.2. Token' 
        |____'Material' 
        |____'Impact' 
        |____'Aling'

我尝试过 regexp 以及库anytree,但没有得到想要的结果。我想给这个列表一个结构。作为一棵树或类似的东西。

python indexing hierarchy
1个回答
0
投票

我会对此进行两次处理,将您的数据重塑为层次结构。我认为这是最简单的事情。在实践中,我可能会一次性完成此操作,但为了更清楚起见,我们分两次完成。

给出:

titles = [
    "13.3. Risk",
    "13.3.1. Strategy",
    "SubStrategy",
    "13.3.2. Token",
    "Material",
    "Impact",
    "Aling"
]

第 1 步: 创建编号项目及其直接子项的字典

results = {}
for title in titles:
    if title[0].isnumeric():
        key, name = title.split(" ")
        key = key.strip(".")
        current = results.setdefault(key, {"name": title, "children": []})
        continue
    current["children"].append(title)

这将生成一个如下所示的字典:

{
    "13.3": {
        "name": "13.3. Risk",
        "children": []
    },
    "13.3.1": {
        "name": "13.3.1. Strategy",
        "children": [
            "SubStrategy"
        ]
    },
    "13.3.2": {
        "name": "13.3.2. Token",
        "children": [
            "Material",
            "Impact",
            "Aling"
        ]
    }
}

第 2 步: 现在我们可以对其进行迭代,并通过将项目设置为适当父级的子级来聚合树的根。请注意,我们假设根节点是无法找到父节点的节点。

roots = []
for key, value in results.items():
    parent_key = key.rsplit(".", 1)[0]
    if parent_key not in results:
        roots.append(value)
        continue
    results[parent_key]["children"].append(value)

现在我们可以使用我们的根:

for root in roots:
    print("----------------------")
    print(json.dumps(root, indent=4))
    print("----------------------")

给我们:

{
    "name": "13.3. Risk",
    "children": [
        {
            "name": "13.3.1. Strategy",
            "children": [
                "SubStrategy"
            ]
        },
        {
            "name": "13.3.2. Token",
            "children": [
                "Material",
                "Impact",
                "Aling"
            ]
        }
    ]
}
© www.soinside.com 2019 - 2024. All rights reserved.