python - 从 Python 中的展平数据生成嵌套列表

标签 python list recursion tree

为了生成目录,我在 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/

相关文章:

python - psycopg2 "TypeError: not all arguments converted during string formatting"

c++ - 不同类 C++ 的对象列表

recursion - 返回递归闭包的函数签名

c++ - 使用模板元编程的位交换功能

r - R中的归并排序

python - 在线程/核心/节点上并行化 Python 中的 for 循环

python - 如何在 Pygame 中以网格状结构显示文本?

python - sknn多层感知器分类器

python - 拆分一个字符串并使用 Python 将它们保存到列表中

java - 从ArrayList中抓取随机对象不是随机的