распечатать словарь python иерархии в колбе jinja

#python #html #dictionary #flask #jinja2

Вопрос:

У меня есть вложенный словарь на python:

 result = {'Physics': {'Mechanics': {'Kinematics ': {}, 'Dynamics': {}}}, 'Math': {'Algebra': {'Polynomials': {'sum of polynomials': {}}}}}  

Мне нужно распечатать в колбе/джинджа эти данные. Я хочу получить дерево или вложенный список. Результат должен быть:

 lt;ul class="list"gt;  lt;li class="title"gt;  lt;a href="/"gt;"Physics"lt;/agt;  lt;/ligt;  lt;ul class="list2"gt;  lt;li class="title2"gt;  lt;a href="/"gt;"Mechanics"lt;/agt;  lt;/ligt;  lt;ul class="list3"gt;  lt;li class="title3"gt;  lt;a href="/"gt;"Kinematics "lt;/agt;  lt;/ligt;  lt;li class="title3"gt;  lt;a href="/"gt;'Dynamics'lt;/agt;  lt;/ligt;  lt;/ulgt;  lt;/ulgt;  lt;/ulgt;  lt;ul class="list"gt;  lt;li class="title"gt;  lt;a href="/"gt;'Math'lt;/agt;  lt;/ligt;  lt;ul class="list2"gt;  lt;li class="title2"gt;  lt;a href="/"gt;'Algebra'lt;/agt;  lt;/ligt;  lt;ul class="list3"gt;  lt;li class="title3"gt;  lt;a href="/"gt;'Polynomials'lt;/agt;  lt;/ligt;  lt;ul class="list4"gt;  lt;li class="title4"gt;  lt;a href="/"gt;'sum of polynomials'lt;/agt;  lt;/ligt;  lt;/ulgt;  lt;/ulgt;  lt;/ulgt;  lt;/ulgt;  

Как я должен решить свою проблему?

Ответ №1:

Вы можете использовать рекурсию для создания HTML-разметки словаря, а затем передать полученную строку в свой шаблон:

 def to_html(d, c = 1):  if not all(d.values()):  return f'lt;ul class="list{"" if c == 1 else c}"gt;' 'n'.join(f'lt;li class="title{"" if c == 1 else c}"gt;lt;a href="/"gt;{a}lt;/agt;lt;/ligt;{"" if not b else to_html(b, c 1)}' for a, b in d.items()) 'lt;/ulgt;'  return 'n'.join(f'lt;li class="title{"" if c == 1 else c}"gt;lt;a href="/"gt;{a}lt;/agt;lt;/ligt;' if not b else   f"""  lt;ul class="list{"" if c == 1 else c}"gt;  lt;li class="title{"" if c == 1 else c}"gt;lt;a href="/"gt;{a}lt;/agt;lt;/ligt;  {to_html(b, c 1)}  lt;/ulgt;  """  for a, b in d.items())  d = {'Physics': {'Mechanics': {'Kinematics ': {}, 'Dynamics': {}}}, 'Math': {'Algebra': {'Polynomials': {'sum of polynomials': {}}}}} print(to_html(d))  

Выход:

 lt;ul class="list"gt;  lt;li class="title"gt;  lt;a href="/"gt;  Physics  lt;/agt;  lt;/ligt;  lt;ul class="list2"gt;  lt;li class="title2"gt;  lt;a href="/"gt;  Mechanics  lt;/agt;  lt;/ligt;  lt;ul class="list3"gt;  lt;li class="title3"gt;  lt;a href="/"gt;  Kinematics  lt;/agt;  lt;/ligt;  lt;li class="title3"gt;  lt;a href="/"gt;  Dynamics  lt;/agt;  lt;/ligt;  lt;/ulgt;  lt;/ulgt; lt;/ulgt; lt;ul class="list"gt;  lt;li class="title"gt;  lt;a href="/"gt;  Math  lt;/agt;  lt;/ligt;  lt;ul class="list2"gt;  lt;li class="title2"gt;  lt;a href="/"gt;  Algebra  lt;/agt;  lt;/ligt;  lt;ul class="list3"gt;  lt;li class="title3"gt;  lt;a href="/"gt;  Polynomials  lt;/agt;  lt;/ligt;  lt;ul class="list4"gt;  lt;li class="title4"gt;  lt;a href="/"gt;  sum of polynomials  lt;/agt;  lt;/ligt;  lt;/ulgt;  lt;/ulgt;  lt;/ulgt; lt;/ulgt;  

Затем, в flask :

 @app.route('/hierarchy', methods=['GET']) def hierarchy():  d = {'Physics': {'Mechanics': {'Kinematics ': {}, 'Dynamics': {}}}, 'Math': {'Algebra': {'Polynomials': {'sum of polynomials': {}}}}}  return flask.render_template('show_hierarchy.html', hierarchy=to_html(d))  

show_hierarchy.html :

 lt;h1gt;Hierarchylt;/h1gt; {{hierarchy}}