<p>这是另一个版本供你参考。在</p>
<ul>
<li>这个版本有一个解析器,但是没有非常健壮的错误检查。在</li>
<li>基于@hustmphrr的回答,我还更新了代码来处理“空角”和“中间空壳”</li>
<li><p>我还从stdin添加了read文件,从而能够与bash脚本集成。你需要取消最后一部分的注释。假设这个脚本被称为脚本.py,您可以调用<code>python script.py < test.txt</code>来读取文件。这个文本.txt将存储您提供的文本内容。在</p>
<pre><code>#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
input_str = """apple: banana eggplant
banana: cantaloupe durian
eggplant:
fig:
"""
leaf_end_str = '└─ '
leaf_inner_str = '├─ '
child_conn_str = '│ '
empty_str = ' '
#debug = True
debug = False
def recursive_print(cur_root, p2r_list, prefix, is_end=False, only_one=False):
# first print current node
if only_one or is_end:
print '%s%s%s'%(prefix, leaf_end_str, cur_root)
else:
print '%s%s%s'%(prefix, leaf_inner_str, cur_root)
if only_one == True:
next_prefix = prefix + empty_str
else:
next_prefix = prefix + child_conn_str
#print p2r_list[cur_root]
if p2r_list.has_key(cur_root):
next_only_one = ( len(p2r_list[cur_root]) == 1 )
for child in p2r_list[cur_root]:
next_is_end = (child == p2r_list[cur_root][-1] )
recursive_print(child, p2r_list, next_prefix, is_end = next_is_end, only_one = next_only_one)
def tree_print(content):
# get root and parent-children relation
root = {} # check whether a node is root
p2r_list = {} # store the parent-child relation
for line in content.split('\n'):
line = line.strip()
if line == "":
continue
ws = line.split(':') # separate parent and child
if not root.has_key(ws[0]):
root[ws[0]] = True
if not p2r_list.has_key(ws[0]):
p2r_list[ws[0]] = []
if len(ws) > 1:
for child in ws[1].strip().split(' '):
if child == '':
continue
root[child] = False
p2r_list[ws[0]].append(child)
if debug:
print root, '\n', p2r_list
root_list = [r for r in root.keys() if root[r]]
for r in root_list:
if r == root_list[-1]:
recursive_print(r, p2r_list, '', is_end = True, only_one=True)
else:
recursive_print(r, p2r_list,'')
if __name__ == "__main__":
tree_print(input_str )
"""
content = sys.stdin.read()
#print content
if content != '':
tree_print( content)
#"""
</code></pre></li>
</ul>