从普通列表中,列出 parent、child 对,然后是嵌套字典
from a normal list, make list of parent,child pairs and subsequently a nested dictionary
我想创建一个 json/ 嵌套字典,一个结构如下的列表:
print(header_styles)
[('Heading 0', 'Essay',1),
('Heading 1', 'Introduction',2),
('Heading 2', 'the outline',3),
('Heading 3', 'The basics',4),
('Heading 1', 'Results',5),
('Heading 1', 'Methods',6),
('Heading 2', 'Calculations',7),
('Heading 3', 'algorithms',8),
('Heading 4', 'Algorithm 1',9),
('Heading 4', 'Algorithm 2',10),
('Heading 1', 'Conclusion',11)]
我想将此列表转换为嵌套字典(放入 json 文件),如下所示:
{
name:'Essay',
children:[{
name:'Introduction'
children:[{
name:'the outline',
children:[{
name:'The basics'
children:[]
}]
}]
},
{
name:'Results'
children:[]
},
{
name:'Methods',
children:[{
name:'Calculations',
children:[{
name:'algorithm 1',
children:[]
},{
name:'algorithm 2'
children:[]
}]
}]
},
{
name:'Conclusion'
children:[]
}
]
}
因此,正如您所见,嵌套字典的结构方式是标题样式定义了分支的层数 - heading3 是任何前面的 heading2 的子分支,它是 sub-branch任何前面的标题 1.
我如何遍历该列表并制作另一个 parent、children 对的列表,以便我可以从中制作树?
它可以与以下内容一起使用
levels=[]
for i in range(0,len(header_styles)):
header_styles[i][0]=int(header_styles[i][0].replace('Heading ',''))
for j in texts:
if header_styles[i][1]==j[0]:
header_styles[i].append(j[1])
levels.append(header_styles[i][0])
pairs=[]
def find_pairs(i_s,header_styles,levels):
i_e=i_s
while i_e > -1:
level=1
start,end = header_styles[i_s],header_styles[i_e]
if end[0] < start[0]:
print('match found')
print(start,end)
return (start[2],end[2],levels[i_s]+1,start[1])
break
level+=1
i_e-=1
last = len(header_styles)-1
pairs=[]
for i in range(last,0,-1):
print(i)
pairs.append(find_pairs(i,header_styles,levels))
pairs=pairs[::-1]
pairs.insert(0,(0,'NA',1,'Essay'))
制作父子列表后-然后制作嵌套字典:
queue_tuples=pairs
pGraph = {"_id":0,"name":queue_tuples[3],"children":[]}
for tuple in queue_tuples:
level = tuple[2]
g = pGraph["children"]
for i in range(level-1):
for e in g:
if tuple[1]==e["_id"]:
g = e["children"]
flag = 0
for e in g:
if tuple[0]==e["_id"]:
flag = 1
break
if flag==0:
g.append({"_id":tuple[0],"name":tuple[3],"children":[]})
print(pGraph)
我想创建一个 json/ 嵌套字典,一个结构如下的列表:
print(header_styles)
[('Heading 0', 'Essay',1),
('Heading 1', 'Introduction',2),
('Heading 2', 'the outline',3),
('Heading 3', 'The basics',4),
('Heading 1', 'Results',5),
('Heading 1', 'Methods',6),
('Heading 2', 'Calculations',7),
('Heading 3', 'algorithms',8),
('Heading 4', 'Algorithm 1',9),
('Heading 4', 'Algorithm 2',10),
('Heading 1', 'Conclusion',11)]
我想将此列表转换为嵌套字典(放入 json 文件),如下所示:
{
name:'Essay',
children:[{
name:'Introduction'
children:[{
name:'the outline',
children:[{
name:'The basics'
children:[]
}]
}]
},
{
name:'Results'
children:[]
},
{
name:'Methods',
children:[{
name:'Calculations',
children:[{
name:'algorithm 1',
children:[]
},{
name:'algorithm 2'
children:[]
}]
}]
},
{
name:'Conclusion'
children:[]
}
]
}
因此,正如您所见,嵌套字典的结构方式是标题样式定义了分支的层数 - heading3 是任何前面的 heading2 的子分支,它是 sub-branch任何前面的标题 1.
我如何遍历该列表并制作另一个 parent、children 对的列表,以便我可以从中制作树?
它可以与以下内容一起使用
levels=[]
for i in range(0,len(header_styles)):
header_styles[i][0]=int(header_styles[i][0].replace('Heading ',''))
for j in texts:
if header_styles[i][1]==j[0]:
header_styles[i].append(j[1])
levels.append(header_styles[i][0])
pairs=[]
def find_pairs(i_s,header_styles,levels):
i_e=i_s
while i_e > -1:
level=1
start,end = header_styles[i_s],header_styles[i_e]
if end[0] < start[0]:
print('match found')
print(start,end)
return (start[2],end[2],levels[i_s]+1,start[1])
break
level+=1
i_e-=1
last = len(header_styles)-1
pairs=[]
for i in range(last,0,-1):
print(i)
pairs.append(find_pairs(i,header_styles,levels))
pairs=pairs[::-1]
pairs.insert(0,(0,'NA',1,'Essay'))
制作父子列表后-然后制作嵌套字典:
queue_tuples=pairs
pGraph = {"_id":0,"name":queue_tuples[3],"children":[]}
for tuple in queue_tuples:
level = tuple[2]
g = pGraph["children"]
for i in range(level-1):
for e in g:
if tuple[1]==e["_id"]:
g = e["children"]
flag = 0
for e in g:
if tuple[0]==e["_id"]:
flag = 1
break
if flag==0:
g.append({"_id":tuple[0],"name":tuple[3],"children":[]})
print(pGraph)