为了生成目录,我在 Python 列表中提供了这些数据:
data = [
{title: 'Section 1', level: 1, page_number: 1},
{title: 'Section 1.1', level: 2, page_number: 2},
{title: 'Section 1.2', level: 2, page_number: 3},
{title: 'Section 2', level: 1, page_number: 4},
{title: 'Section 2.1', level: 2, page_number: 5},
{title: 'Section 3', level: 1, page_number: 6},
]
据此,我想获得这种嵌套结构,更适合模板引擎的使用:
toc = [
{title: 'Section 1', page_number: 1, sub: [
{title: 'Section 1.1', page_number: 2, sub: []},
{title: 'Section 1.2', page_number: 3, sub: []},
]},
{title: 'Section 2', page_number: 4, sub: [
{title: 'Section 2.1', page_number: 5, sub: []},
]},
{title: 'Section 3', page_number: 6, sub: []},
]
关于如何实现这一目标的提示?我尝试使用递归函数,但它对我有限的大脑来说变得越来越棘手。
非常感谢任何帮助。
编辑: 添加了一个部分条目最终可以没有子条目的事实。抱歉错过了。
最佳答案
假设章节按顺序排列,这意味着子章节总是在父章节之后,并且没有缺少父章节(跳过级别):
import pprint
data = [
{'title': 'Section 1', 'level': 1, 'page_number': 1},
{'title': 'Section 1.1', 'level': 2, 'page_number': 2},
{'title': 'Section 1.2', 'level': 2, 'page_number': 3},
{'title': 'Section 2', 'level': 1, 'page_number': 4},
{'title': 'Section 2.1', 'level': 2, 'page_number': 42},
{'title': 'Section 2.1.1', 'level': 3, 'page_number': 42},
{'title': 'Section 3', 'level': 1, 'page_number': 42},
]
toc = []
stack = [toc]
for d in data:
d['sub'] = []
while d['level'] < len(stack):
stack.pop()
while d['level'] > len(stack):
stack.append(stack[-1][-1]['sub'])
stack[-1].append(d)
pprint.pprint(toc)
结果:
[{'level': 1,
'page_number': 1,
'sub': [{'level': 2, 'page_number': 2, 'sub': [], 'title': 'Section 1.1'},
{'level': 2, 'page_number': 3, 'sub': [], 'title': 'Section 1.2'}],
'title': 'Section 1'},
{'level': 1,
'page_number': 4,
'sub': [{'level': 2,
'page_number': 42,
'sub': [{'level': 3,
'page_number': 42,
'sub': [],
'title': 'Section 2.1.1'}],
'title': 'Section 2.1'}],
'title': 'Section 2'},
{'level': 1, 'page_number': 42, 'sub': [], 'title': 'Section 3'}]
编辑:将其更改为在没有子项的地方有空的“子”项。查看编辑历史中的其他变体。
关于python - 从 Python 中的展平数据生成嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3130931/