我在 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,但没有得到想要的结果。我想给这个列表一个结构。作为一棵树或类似的东西。
我会对此进行两次处理,将您的数据重塑为层次结构。我认为这是最简单的事情。在实践中,我可能会一次性完成此操作,但为了更清楚起见,我们分两次完成。
给出:
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"
]
}
]
}