[英]Generate a nested list from flatten data in Python
要生成內容列表,我在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'}]
編輯 :將其更改為沒有子項的空“子”項。 請參閱編輯歷史記錄中的其他變體。
這樣做你想要的嗎?
TITLE, LEVEL, PAGE_NUMBER, SUB = 'title', 'level', 'page_number', 'sub'
data = [
{TITLE: 'Section 1', LEVEL: 1, PAGE_NUMBER: 1},
{TITLE: 'Section 1.1', LEVEL: 2, PAGE_NUMBER: 2},
{TITLE: 'Section 1.1.1', LEVEL: 3, 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},
]
levels = [ { SUB: [] } ]
for section in data:
section = dict(section)
current = section[LEVEL]
section[SUB] = []
levels[current-1][SUB].append(section)
del levels[current:]
levels.append(section)
toc = levels[0][SUB]
from pprint import pprint
pprint(toc)
您可以遍歷列表中的每個條目,並從那里構建新列表。 每當有“Section xy”時,你都會在sub下添加它。
newData = []
curParent = None
for d in data:
# child
if d['title'].find('.') > 0:
assert curParent # Make sure we have a valid parent dictionary
curParent['sub'].append({'title': d['title'], 'page_number': d['page_number'])
# parent
else:
curParent = {'title': d['title'], 'page_number': d['page_number'], 'sub': []}
newData.append(curParent)
這應該適用於2或3個級別,如果您需要的不僅僅是不同的方法可能會更好。 此外,find('。')可能不適用於其他標題,但要么使用級別字段(在您的示例中似乎是多余的)或正則表達式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.