2015-05-29 78 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 
>