2015-05-29 82 views
-1

您好,我正在学习如何在python中构建递归函数。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 

而这里的另一个例子: [ '一个',[ '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 
+0

这与我想要的很接近,但并不完全正确。我似乎无法发布输出在注释中看起来应该看起来多的代码块,所以我会将它作为答案发布,以便您可以看到它应该是什么样子。 –

+0

只需编辑您的问题。不要发布你的问题的细节作为答案。 –

+0

好吧,我已经看到你的建议,但是这违背了你链接到你自己的列表表示。这里的想法是,在列表的每一级,第一个元素是父项,第二个和第三个元素是子项。请描述您想用于在问题中创建列表表示的实际原则。 –

0
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) 
+0

@sobolevn为我正确工作。 – satoru

+0

错误在于,如果您将节点名称更改为'f'而不是'青蛙',它实际上会更改树结构。 – cdlane

-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 
+0

当我在第二个例子上运行这个时,我没有得到预期的结果(第一个例子工作正常。)另外,你有一个'if'语句有三个子句,如果'l'是一个列表,如果'l '不是一个永远不应该到达的列表和“else”! – cdlane

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 
>