显示嵌套python字典中的HTML列表

2024-06-26 00:26:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到了以下Python字典:

d = {'DataType': 'XY', 'DataReportGrp': {'NoSides_1': {'Side': '2', 'Reports': {'NoReportIDs_1': {'ReportID': '250001'}, 'NoReportIDs_2': {'ReportID': '250002'}}}}}

我想将其转换为类似以下内容的HTML列表:

    <li> DataType </li>
    <li> DataReportGrp </li>
    <ul>
       <li> NoSides_1 </li>
       <ul>
          <li> Side </li>
          <li> Reports </li>
          <ul>
             <li> NoReportIDs_1 </li>
             <ul>
                <li> ReportID </li>
             </ul>
             <li> NoReportIDs_2 </li>
             <ul>
                <li> ReportID </li>
             </ul>
          </ul>
       </ul>
    </ul>

我试着用下面的代码来做这件事。不幸的是,我不知道要实现什么逻辑来确定何时在正确的时间关闭</ul>组,而且可能是该字典将来会有更多嵌套级别:

    def nested_groups(levels):
        groups = list()
    
        def going_through(d):
            if isinstance(levels, dict):
                for kd, kv in d.items():
                    if isinstance(kv, dict):
                        groups.append(kd)
                        print(f" <li> --- {kd} </li>")
                        print(" <ul>")
    
                        going_through(kv)
                    else:
                        print(f" <li> --- {kd} </li>")
    
        going_through(levels)
        print("</ul>" * len(groups))

这导致:


    <li> --- DataType </li>
    <li> --- DataReportGrp </li>
    <ul>
    <li> --- NoSides_1 </li>
    <ul>
    <li> --- Side </li>
    <li> --- Reports </li>
    <ul>
    <li> --- NoReportIDs_1 </li>
    <ul>
    <li> --- ReportID </li>
    <li> --- NoReportIDs_2 </li>
    <ul>
    <li> --- ReportID </li>
    </ul></ul></ul></ul></ul>

我们将非常感谢您的帮助


Tags: liulsidekdgroupsreportsprintlevels
1条回答
网友
1楼 · 发布于 2024-06-26 00:26:55

可以使用递归生成器函数:

d = {'DataType': 'XY', 'DataReportGrp': {'NoSides_1': {'Side': '2', 'Reports': {'NoReportIDs_1': {'ReportID': '250001'}, 'NoReportIDs_2': {'ReportID': '250002'}}}}}
def to_html(d, c = 0):
   for a, b in d.items():
      yield '{}<li>{}</li>'.format('   '*c, a)
      if isinstance(b, dict):
         yield '{}<ul>\n{}\n{}</ul>'.format('   '*c, "\n".join(to_html(b, c + 1)), '   '*c)

print('\n'.join(to_html(d)))

输出:

<li>DataType</li>
<li>DataReportGrp</li>
<ul>
   <li>NoSides_1</li>
   <ul>
      <li>Side</li>
      <li>Reports</li>
      <ul>
         <li>NoReportIDs_1</li>
         <ul>
            <li>ReportID</li>
         </ul>
         <li>NoReportIDs_2</li>
         <ul>
            <li>ReportID</li>
         </ul>
      </ul>
   </ul>
</ul>

相关问题 更多 >