您好我正在学习如何在python中构造递归函数。
我一直在努力研究如何打印出代表列表的树。
树表示为列表。列表的第一个元素是节点的数据或值,同一列表中的以下元素是节点的子节点,可以有多个子节点。如果列表的元素本身是列表,则在该位置开始新的子树。
基本上我想要做的是打印这样的二进制树列表,格式化使其更容易阅读。
这样的列表: ['a',['b','c',['d','i'],'e'],'f',['g','h',['j','k' ,'l','m']]]
以递归方式将其打印出来,看起来像这样。
a
+---b
+---c
+---d
+---i
+---e
+---f
+---g
+---h
+---j
+---k
+---l
+---m
这是另一个例子: ['a',['b','c','d'],['e','f'],'g'] 像这样打印出来:
a
+---b
+---c
+---d
+---e
+---f
+---g
因此,每个孩子在孩子的价值之前出现在“+ ---”的一行。此字符串直接从父值开始。每个级别的级别进一步缩进4个额外的空格。
答案 0 :(得分:1)
这就是你追求的目标吗?
lst = ['a', ['b', 'c', ['d', 'i'], 'e'], 'f', ['g', 'h', ['j', 'k', 'l', 'm']]]
def print_list(lst, level=0):
print(' ' * (level - 1) + '+---' * (level > 0) + lst[0])
for l in lst[1:]:
if type(l) is list:
print_list(l, level + 1)
else:
print(' ' * level + '+---' + l)
print_list(lst)
给出了:
a
+---b
+---c
+---d
+---i
+---e
+---f
+---g
+---h
+---j
+---k
+---l
+---m
对于第二个例子:
lst = ['a', ['b', 'c', 'd'], ['e', 'f'], 'g']
我们得到:
a
+---b
+---c
+---d
+---e
+---f
+---g
答案 1 :(得分:1)
def traverse(t, level=0, indent=4):
value = t[0]
if level > 0:
prefixed_str = ' ' * (indent * (level - 1)) + '+---'
else:
prefixed_str = ''
print prefixed_str + value
for child in t[1:]:
traverse(child, level+1)
答案 2 :(得分:0)
@satoru和@AndrzejPronobis解决方案的混合
def print_tree(tree_or_leaf, level=0):
head, *tail = tree_or_leaf if isinstance(tree_or_leaf, list) else [tree_or_leaf]
print(' ' * (level - 1) + '+---' * (level > 0) + head)
for tree_or_leaf in tail:
print_tree(tree_or_leaf, level + 1)
print_tree(tree)
预期输出:
> python3 test.py
a
+---b
+---c
+---d
+---i
+---e
+---f
+---g
+---h
+---j
+---k
+---l
+---m
>
答案 3 :(得分:-1)
我对Andrzej Pronobis提交的示例进行了更改,以便列表中的列表是新级别的开头,而不是第一个项目是该列表级别中其余项目的父级。这看起来更容易阅读,因为每个开括号'['是子级别的开头,其父级是开括号之前的项目,并且包含所有兄弟和子级。
在此示例中,“a”和“f”位于层次结构中的同一级别。 'b','c'和'e'是'a','d'的孩子,'i'是'c'的孩子,依此类推。
代码:
lst = ['a', ['b', 'c', ['d', 'i'], 'e'], 'f', ['g', 'h', ['j', 'k', 'l', 'm']]]
def print_list(lst, level = 0):
for l in lst:
if type(l) is not list:
print(' ' * (level - 1) + '+---' * (level > 0) + l)
elif type(l) is list:
print_list(l, level + 1)
else:
print(' ' * level + '+---' + l)
print_list(lst)
将产生:
a
+---b
+---c
+---d
+---i
+---e
f
+---g
+---h
+---j
+---k
+---l
+---m