我想将此数据结构呈现为无序列表。
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>
我可以在没有递归的情况下做到这一点,但这并不好玩。使用递归解决此问题的最有效方法是什么?
谢谢!
答案 0 :(得分:3)
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>
答案 1 :(得分:2)
即使您的结构很简单,我也不会使用双元素列表。使用一些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>
标记中。