如何通过python嵌套字典循环创建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']

我目前在Python中有一个嵌套的dictionary对象,我希望通过它来循环创建一个html表。我已经知道该做什么的基本知识,但需要帮助确定每列应该跨越的行数。让我用一个例子进一步解释:

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>