Python以递归方式从列表结构中打印树

时间:2015-05-29 05:47:14

标签: python python-3.x recursion

您好我正在学习如何在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个额外的空格。

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