如何从Python中的嵌套字典创建引导手风琴?

如何从Python中的嵌套字典创建引导手风琴?,python,twitter-bootstrap,flask,recursion,accordion,Python,Twitter Bootstrap,Flask,Recursion,Accordion,我有一本这样的嵌套字典: d = {1: {4: {6: {}, 7: {}, 8: {}}, 5: {}}, 2: {}, 3: {}} 可以可视化为: 1 4 6 7 8 5 2 3 我的目标是创建一个引导手风琴,就像这个链接给出的那样: 这里有一个屏幕截图: 为了实现我的目标,我想我可以在python脚本中生成html代码,该脚本可以使用flask呈现。我想到的代码是: def pretty(d, indent=0, inde

我有一本这样的嵌套字典:

d = {1: {4: {6: {}, 7: {}, 8: {}}, 5: {}}, 2: {}, 3: {}}
可以可视化为:

1
    4
       6
       7
       8
    5
2
3
我的目标是创建一个引导手风琴,就像这个链接给出的那样:

这里有一个屏幕截图:

为了实现我的目标,我想我可以在python脚本中生成html代码,该脚本可以使用flask呈现。我想到的代码是:

def pretty(d, indent=0, indent_before=0):
    html_code = ''
    for key, value in d.items():
            
        if indent > indent_before:
            html_code += """
            <div id="collapse-1-1" class="collapse" data-parent="#accordion-1" aria-labelledby="heading-1-1">
                    <div class="card-body">
                    <div id="accordion-1-1">
            """
        elif indent == indent_before:
            html_code += """
            </div>
            """
        else:
            html_code += """
            </div>
            """*indent

        html_code +="""
            <div class="card">
                <div class="card-header" id="heading-{}">
                    <h5 class="mb-0">
                    <a role="button" data-toggle="collapse" href="#collapse-{}" aria-expanded="false" aria-controls="collapse-{}">
                            {}
                    </a>
                    </h5>
                </div>
        """.format(key ,key, key, key, indent)
        #print('\t' * (indent) + str(key) + '({})({})\n'.format(indent,indent_before))
        if isinstance(value, dict):
            html_code  += pretty(value, indent+1, indent) 
        else:
            print('\t' * (indent+1) + str(value))

    return html_code
        
msg = pretty(result)
print(msg)
def pretty(d,缩进=0,缩进前=0):
html_代码=“”
对于键,d.items()中的值:
如果缩进>前缩进:
html_代码+=“”“
"""
elif缩进==在以下情况之前缩进:
html_代码+=“”“
"""
其他:
html_代码+=“”“
“”*缩进
html_代码+=“”“
“”格式(键、键、键、键、缩进)
#打印('\t'*(缩进)+str(键)+'({})({})\n'.格式(缩进,前缩进))
如果isinstance(值,dict):
html_代码+=pretty(值,缩进+1,缩进)
其他:
打印('\t'*(缩进+1)+str(值))
返回html\u代码
msg=pretty(结果)
打印(msg)
基本上,它是一个递归函数,遍历所有字典项。但是,此代码有3个度量错误,我不知道如何修复:

  • 手风琴参照不会在每次添加新层时更改
  • 在每个项目之前添加class=“collapse”div
  • 我无法正确地关闭div,因为我无法知道每个级别添加了多少项
我得到的输出如下:

<div class="card">
                <div class="card-header" id="heading-1">
                    <h5 class="mb-0">
                    <a role="button" data-toggle="collapse" href="#collapse-1" aria-expanded="false" aria-controls="collapse-1">
                            1
                    </a>
                    </h5>
                </div>

            <div id="collapse-1-1" class="collapse" data-parent="#accordion-1" aria-labelledby="heading-1-1">
                    <div class="card-body">
                    <div id="accordion-1-1">

            <div class="card">
                <div class="card-header" id="heading-4">
                    <h5 class="mb-0">
                    <a role="button" data-toggle="collapse" href="#collapse-4" aria-expanded="false" aria-controls="collapse-4">
                            4
                    </a>
                    </h5>
                </div>

            <div id="collapse-1-1" class="collapse" data-parent="#accordion-1" aria-labelledby="heading-1-1">
                    <div class="card-body">
                    <div id="accordion-1-1">

            <div class="card">
                <div class="card-header" id="heading-6">
                    <h5 class="mb-0">
                    <a role="button" data-toggle="collapse" href="#collapse-6" aria-expanded="false" aria-controls="collapse-6">
                            6
                    </a>
                    </h5>
                </div>

            <div id="collapse-1-1" class="collapse" data-parent="#accordion-1" aria-labelledby="heading-1-1">
                    <div class="card-body">
                    <div id="accordion-1-1">

            <div class="card">
                <div class="card-header" id="heading-7">
                    <h5 class="mb-0">
                    <a role="button" data-toggle="collapse" href="#collapse-7" aria-expanded="false" aria-controls="collapse-7">
                            7
                    </a>
                    </h5>
                </div>

            <div id="collapse-1-1" class="collapse" data-parent="#accordion-1" aria-labelledby="heading-1-1">
                    <div class="card-body">
                    <div id="accordion-1-1">

            <div class="card">
                <div class="card-header" id="heading-8">
                    <h5 class="mb-0">
                    <a role="button" data-toggle="collapse" href="#collapse-8" aria-expanded="false" aria-controls="collapse-8">
                            8
                    </a>
                    </h5>
                </div>

            <div id="collapse-1-1" class="collapse" data-parent="#accordion-1" aria-labelledby="heading-1-1">
                    <div class="card-body">
                    <div id="accordion-1-1">

            <div class="card">
                <div class="card-header" id="heading-5">
                    <h5 class="mb-0">
                    <a role="button" data-toggle="collapse" href="#collapse-5" aria-expanded="false" aria-controls="collapse-5">
                            5
                    </a>
                    </h5>
                </div>

            </div>

            <div class="card">
                <div class="card-header" id="heading-2">
                    <h5 class="mb-0">
                    <a role="button" data-toggle="collapse" href="#collapse-2" aria-expanded="false" aria-controls="collapse-2">
                            2
                    </a>
                    </h5>
                </div>

            </div>

            <div class="card">
                <div class="card-header" id="heading-3">
                    <h5 class="mb-0">
                    <a role="button" data-toggle="collapse" href="#collapse-3" aria-expanded="false" aria-controls="collapse-3">
                            3
                    </a>
                    </h5>
                </div>


你能提出一个聪明而优雅的方法从字典开始生成手风琴吗?只要我得到可以呈现的html代码,您就可以根据需要修改代码。我也曾想过使用Jinja2,但我对此一无所知。提前谢谢。

我能够就我真正的问题得出结果。代码如下:

def pretty(d, indent=0, indent_previous_layer=-1, counter=0):
    html_code = ''
    indent_privious_item = indent_previous_layer
    for key, value in d.items():             
            
        if indent > indent_privious_item and counter!=0:
            html_code += """
            <div id="collapse-{}" class="collapse" data-parent="#accordion-{}" aria-labelledby="heading-{}">
            <div class="card-body">
                <div id="accordion-{}">
            """.format(counter, indent-1, counter, indent)
        elif indent == indent_privious_item:
            html_code += """
            </div>
            """
            if indent==0:
                html_code += """
                <!--End of Card-->
                """
        elif indent < indent_privious_item:
            if indent==0:
                html_code += """
                                </div>
                """
                html_code += """
                            </div>
                        </div>
                    </div>
                </div>
                """*(indent_privious_item-indent)
                html_code += """
                <!--End of Card-->
                """
            else:
                html_code += """
                                </div>
                """
                html_code += """
                            </div>
                        </div>
                    </div>
                </div>
                """*(indent_privious_item-indent)

        html_code +="""
        <div class="card">
        <div class="card-header" id="heading-{}">
            <h5 class="mb-0">
                <a role="button" data-toggle="collapse" href="#collapse-{}" aria-expanded="true" aria-controls="collapse-{}">
                 Depth Level {}
                </a>
            </h5>
        </div>
            <div class="card-body pb-0">
                <!--h5 class="card-title"></h5-->
                <p class="card-text">{}</p>
                    <ul class="list-group">""".format(counter+1, counter+1, counter+1, indent, "Some text")

        html_code += """
                    </ul>
            </div>
    
            """

        if isinstance(value, dict):
            code, indent_privious_item, counter = pretty(value, indent+1, indent, counter+1)
            html_code += code
        else:
            print('\t' * (indent+1) + str(value))
        
    return html_code, indent_privious_item, counter
def pretty(d,缩进=0,缩进上一层=-1,计数器=0):
html_代码=“”
缩进\u私有\u项=缩进\u上一层
对于键,d.items()中的值:
如果缩进>缩进私人物品和计数器=0:
html_代码+=“”“
“”格式(计数器,缩进-1,计数器,缩进)
elif缩进==缩进专有项:
html_代码+=“”“
"""
如果缩进=0:
html_代码+=“”“
"""
elif缩进<缩进专用项:
如果缩进=0:
html_代码+=“”“
"""
html_代码+=“”“
“”*(缩进\u私有\u项目缩进)
html_代码+=“”“
"""
其他:
html_代码+=“”“
"""
html_代码+=“”“
“”*(缩进\u私有\u项目缩进)
html_代码+=“”“

{}

格式(计数器+1,计数器+1,计数器+1,缩进,“一些文本”) html_代码+=“”“ """ 如果isinstance(值,dict): 代码,缩进项,计数器=pretty(值,缩进+1,缩进,计数器+1) html_代码+=代码 其他: 打印('\t'*(缩进+1)+str(值)) 返回html代码、缩进私有项、计数器
注意:压痕可能会脱落。请随意修理