<p>以下代码将生成您所要求的树结构:</p>
<pre><code>branch = '├'
pipe = '|'
end = '└'
dash = '─'
class Tree(object):
def __init__(self, tag):
self.tag = tag
class Node(Tree):
def __init__(self, tag, *nodes):
super(Node, self).__init__(tag)
self.nodes = list(nodes)
class Leaf(Tree):
pass
def _draw_tree(tree, level, last=False, sup=[]):
def update(left, i):
if i < len(left):
left[i] = ' '
return left
print ''.join(reduce(update, sup, ['{} '.format(pipe)] * level)) \
+ (end if last else branch) + '{} '.format(dash) \
+ str(tree.tag)
if isinstance(tree, Node):
level += 1
for node in tree.nodes[:-1]:
_draw_tree(node, level, sup=sup)
_draw_tree(tree.nodes[-1], level, True, [level] + sup)
def draw_tree(trees):
for tree in trees[:-1]:
_draw_tree(tree, 0)
_draw_tree(trees[-1], 0, True, [0])
</code></pre>
<p>它要求你用给定的形式表示数据。在</p>
<hr/>
<p>关于数据反序列化,您只需要跟踪父节点,这样当叶看起来是节点时,只需替换它:</p>
^{pr2}$
<p>它运行:</p>
<pre><code>>>> text='''apple: banana eggplant
banana: cantaloupe durian
eggplant:
fig:'''
>>> draw_tree(parser(text))
├─ apple
| ├─ banana
| | ├─ cantaloupe
| | └─ durian
| └─ eggplant
└─ fig
</code></pre>
<p>希望它能完全解决你的问题。在</p>
<hr/>
<h2>更新</h2>
<p>我的代码对转角情况提供了一些关注,例如:</p>
<pre><code>>>> text='''apple: banana eggplant
banana: cantaloupe durian
eggplant:'''
>>> draw_tree(parser(text))
└─ apple
├─ banana
| ├─ cantaloupe
| └─ durian
└─ eggplant
</code></pre>
<p>注意<code>apple</code>子节点的最左边,末尾没有{<cd2>},因为它们被抑制了。在</p>
<p>或者中间是空的:</p>
<pre><code>>>> text='''apple: banana
banana: cantaloupe durian
eggplant:'''
>>> draw_tree(parser(text))
├─ apple
| └─ banana
| ├─ cantaloupe
| └─ durian
└─ eggplant
</code></pre>