Вложенное <ul><li> меню навигации с использованием рекурсивной функции Python - PullRequest
2 голосов
/ 22 мая 2010

Я хочу отобразить эту структуру данных как неупорядоченный список.

menu = [
         [1, 0],
           [2, 1],
           [3, 1],
             [4, 3],
             [5, 3],
               [6, 5],
         [7,1]
        ]

[n] [0] - это ключ
[n] [1] ссылается на родительский ключ

Желаемый результат:

<ul>
<li>Node 1</li>

  <ul>
  <li>Node 2</li>
  <li>Node 3</li>

    <ul>
    <li>Node 4</li>
    <li>Node 5</li>

      <ul>
      <li>Node 6</li>
      </ul>

    </ul>

   <li>Node 7</li>
   </ul>

</ul>

Я мог бы сделать это без рекурсии, но это было бы неинтересно. Как наиболее эффективно решить эту проблему с помощью рекурсии?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 22 мая 2010
def render(nodes, parent = 0):
    if parent not in nodes:
        return
    print('<ul>')
    for n in nodes[parent]:
        print('<li>Node %d</li>' % n)
        render(nodes, n)
    print('</ul>')

Вот вывод

>>> nodes = {}
>>> for n in menu:
    if n[1] not in nodes:
        nodes[n[1]] = []
    nodes[n[1]].append(n[0])
>>> render(nodes)
<ul>
<li>Node 1</li>
<ul>
<li>Node 2</li>
<li>Node 3</li>
<ul>
<li>Node 4</li>
<li>Node 5</li>
<ul>
<li>Node 6</li>
</ul>
</ul>
<li>Node 7</li>
</ul>
</ul>
2 голосов
/ 22 мая 2010

Я бы не использовал двухэлементные списки, даже если ваша структура такая простая. Используйте некоторый класс TreeNode и присвойте ему подходящий метод __str__, например

class TreeNode(object):
    # ...
    # methods for adding children (instances of TreeNode again) etc.

    def __str__(self):
        ret = "<li>%s" % self.value

        if self.children:
            children = "".join([str(c) for c in self.children])
            ret += "<ul>%s</ul>" % children 
        ret += "</li>"

        return ret

... или что-то в этом роде. Не проверял, хотя. Заключите представление всего дерева в тег <ul>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...