python - 如何使用 jinja2 显示嵌套字典?
问题描述
我有以下字典:
result = {1: {4: {6: {}, 7: {}, 8: {}}, 5: {}}, 2: {}, 3: {}}
我的目标是显示它的层次结构,如下所示:
1
4
6
7
8
5
2
3
我能够使用python中的递归函数来实现我的目标:
def pretty(d, indent=0):
msg = ''
for key, value in d.items():
msg += '\t' * indent + str(key) + '\n'
if isinstance(value, dict):
msg += pretty(value, indent+1)
else:
msg += '\t' * (indent+1) + str(value) + '\n'
return msg
msg = pretty(result)
print(msg)
现在我想将字典传递给render_template
烧瓶库的函数并使用 jinja2 来复制相同的结果。我尝试了以下代码行,但没有任何反应:
{%- for key, value in result.items() recursive%}
{{loop(value.items())}}
{%- else %}
{{value}}
{%- endif %}
{%- endfor%}
您能否提出一种聪明而优雅的方式来实现我的目标?
注意:我的回答基于这个问题。
解决方案
您的模板必须打印键而不是值。
了解递归深度(对于缩进)的一种方便方法是loop.depth0
变量。
所以试试这个:
from jinja2 import Template
result = {1: {4: {6: {}, 7: {}, 8: {}}, 5: {}}, 2: {}, 3: {}}
template = Template(
"""
{% for key, value in dict.items() recursive %}
{{'\t' * loop.depth0}}{{key}}
{{-loop(value.items())-}}
{% endfor %}
""")
print (template.render(dict=result))
推荐阅读
- javascript - Nightwatch JS:Browser.execute 不执行 javascript
- node.js - (Node.js) 需要将大数拆分成不大于 100 的小数
- javascript - 使用 hljs 库在 React 中动态突出显示代码
- graphql - Apollo 客户端(React):可以从 Query 对象获取规范化数据吗?
- javascript - 谷歌脚本:我无法为对象的键赋值
- c# - 异常处理:通过Main方法显示异常信息
- python - 第二个同时“for循环”执行中断第一个
- css - 上边距不起作用
- angular - 特定路径中所有文件的 Angular 6 路由
- c# - 带有 MVC 核心的 SQLite