如何通过python嵌套字典循环创建html表
我目前在Python中有一个嵌套的dictionary对象,我希望通过它来循环创建一个html表。我已经知道该做什么的基本知识,但需要帮助确定每列应该跨越的行数。让我用一个例子进一步解释:如何通过python嵌套字典循环创建html表,python,html,data-structures,Python,Html,Data Structures,我目前在Python中有一个嵌套的dictionary对象,我希望通过它来循环创建一个html表。我已经知道该做什么的基本知识,但需要帮助确定每列应该跨越的行数。让我用一个例子进一步解释: Input: { "system":{ "System Apps":{ "SystemEnv":[ 'App Test', 'App Memory', 'App Test']
Input:
{
"system":{
"System Apps":{
"SystemEnv":[
'App Test',
'App Memory',
'App Test']
"SystemEnv2":{
"System Test":[
'App Test']
}},
"System Memory":{
"Memeory Test":[
'Memory Func',
'Apes Test']
}
}
}
}
}
输出:
问题在于放置rowspan属性并具有正确的要跨越的行数。我知道这是父母的孩子数量,但我似乎知道如何编码
也是第二优先事项,但如果有人认为这样做更有效,请让我知道
for level1 in dictObj:
html += "<tr>"
html += '<td>{}</td>'.format(level1)
for level2 in dictObj[level1]:
if not first_run:
html += "<tr>"
html += '<td>{}</td>'.format(level2)
first_run = True
for level3 in dictObj[level1][level2]:
if not first_run:
html += "<tr>"
html += '<td>{}</td>'.format(level3)
first_run = True
for app in dictObj[level1][level2][level3]:
if not first_run:
html += "<tr>"
first_run = True
for test in dictObj[level1][level2][level3][app]:
if not first_run:
html += "<tr>"
html += '<td>{}</td>'.format(test)
html += '<td>{}</td>'.format(app)
html += '<td>{}</td>'.format('mb')
html += '<td>{}</td>'.format(1)
html += '</tr>'
first_run = False
dictObj中的level1的:
html+=“”
html+='{}'。格式(级别1)
对于dictObj[level1]中的level2:
如果不是第一次运行:
html+=“”
html+='{}'。格式(级别2)
首次运行=真
对于dictObj[level1][level2]中的level3:
如果不是第一次运行:
html+=“”
html+='{}'。格式(级别3)
首次运行=真
对于dictObj[level1][level2][level3]中的应用程序:
如果不是第一次运行:
html+=“”
首次运行=真
对于dictObj[level1][level2][level3][app]中的测试:
如果不是第一次运行:
html+=“”
html+='{}'。格式(测试)
html+='{}'。格式(应用程序)
html+='{}'。格式('mb')
html+='{}'。格式(1)
html+=''
第一次运行=错误
我建议,对于每个单元格,以单元格名称为键,将行跨度设置为与相应值中字典的其他值处的项数值相等
比如说,
Input:
{
"system":{ # span = 5 since system_apps(2) + SystemEnv(1) + System_Memory(2) = 5
"system_apps":{ # span = 2 since it only contains systemEnv with span of 2
"SystemEnv":{ # span = 2 since there are 2 items (test1 object, test2 object)
test1 object,
test2 object
},
"SystemEnv2":{ # span = 1 since it only contains system test which has span of 1
"System Test":{ # span = 1 (test1 object)
test1 object
},
"System Memory":{ # span = 2 since it only contains memory test which contains span of 2
"Memory Test":{ # span = 2 (corresponds with test3 object and test4 object)
test3 object,
test4 object
}
}
}
}
}
如果知道级别(假设它们都包含相同数量的级别),请将行跨度设置为直接子级跨度的总和,从最远的子级开始。任何不是字典的项都将自动具有1的跨距,您只需添加行跨距,然后继续到下一级,直到到达顶部 您提供的数据似乎不完整,因此键
[System][System Apps][SystemEnv2][System Test][App Test]
突出显示(最长,每隔一个键短1):
数据={
“系统”:{
“系统应用程序”:{
“系统环境”:[
“应用程序测试”,
“应用程序内存”,
“应用程序测试”],
“SystemEnv2”:{
“系统测试”:[
“应用程序测试”]
}
},
“系统内存”:{
“记忆测试”:[
“内存函数”,
“猿类测试”]
}
}
}
# }
# }
def num_项目(d):
如果存在(d,列表):
对于d中的i:
对于第二项中的第(i)项:
收益率二
elif isinstance(d,dict):
对于d.项()中的k,v:
对于第二项中的第(五)项:
收益率二
其他:
收益率1
def遍历(d,cur=[]):
如果存在(d,列表):
对于d中的i:
当前附加((i,总和(num_items(i)))
对于导线中的ii(i,cur):
收益率二
elif isinstance(d,dict):
对于d.项()中的k,v:
当前附加((k,总和(num_items(v)))
对于导线中的ii(v,cur):
收益率二
其他:
屈服电流
德尔库尔[:]
打印(“”)
对于导线测量中的行(数据):
打印(“”)
对于td,行中的行跨度:
打印(“{}.”格式(rowspan,td))
打印(“”)
打印(“”)
印刷品:
<table border=4>
<tr>
<td rowspan=6>system</td>
<td rowspan=4>System Apps</td>
<td rowspan=3>SystemEnv</td>
<td rowspan=1>App Test</td>
</tr>
<tr>
<td rowspan=1>App Memory</td>
</tr>
<tr>
<td rowspan=1>App Test</td>
</tr>
<tr>
<td rowspan=1>SystemEnv2</td>
<td rowspan=1>System Test</td>
<td rowspan=1>App Test</td>
</tr>
<tr>
<td rowspan=2>System Memory</td>
<td rowspan=2>Memeory Test</td>
<td rowspan=1>Memory Func</td>
</tr>
<tr>
<td rowspan=1>Apes Test</td>
</tr>
系统
系统应用程序
系统环境
应用程序测试
应用程序内存
应用程序测试
SystemEnv2
系统测试
应用程序测试
系统存储器
记忆测验
记忆功能
猿类试验
在浏览器中是这样的:
Hi@Matthew Kligerman。非常感谢您的回复。所以问题是,我对确定要跨越的行的值有着相同的想法,然而,我陷入的困境是,如果不循环到更深的层次,我如何确定行中有多少子行?另外,如果我在没有将行写入html的情况下循环更深层次,那么我已经错过了机会,对吗?也许一些代码可以帮助我理解?谢谢您的输入数据与所需的输出不匹配。请重新格式化输入以镜像表结构。@Ajax1234已修复。对于那个错误我很抱歉。我很感激@Andrej。你介意简单地解释一下groupby逻辑的作用吗。另外,我将尝试阅读“yield”,因为我使用的是Python2.7,它抱怨我需要在subgenerator@rominoushana我更新了我的答案,简化了它,并用Python2.7进行了测试。我已经删除了groupby,现在分组是在
traverse()
函数中完成的。
<table border=4>
<tr>
<td rowspan=6>system</td>
<td rowspan=4>System Apps</td>
<td rowspan=3>SystemEnv</td>
<td rowspan=1>App Test</td>
</tr>
<tr>
<td rowspan=1>App Memory</td>
</tr>
<tr>
<td rowspan=1>App Test</td>
</tr>
<tr>
<td rowspan=1>SystemEnv2</td>
<td rowspan=1>System Test</td>
<td rowspan=1>App Test</td>
</tr>
<tr>
<td rowspan=2>System Memory</td>
<td rowspan=2>Memeory Test</td>
<td rowspan=1>Memory Func</td>
</tr>
<tr>
<td rowspan=1>Apes Test</td>
</tr>