2009-12-16 70 views
4

我想創建一個簡單的二進制樹後面這一形象:Python列表添加返回值

http://imgur.com/QCVSW.png

基本上是空的,但是最後的值,所以我創建的根目錄:

root = [list(),list()] 

,並提出了遞歸函數來填充這一切:

def TF(nodeT,nodeF , i): 
    if i == 35 : return 'done' 

    TF(nodeT.append([]),nodeT.append([]) , i = i + 1) #append T , F in the true node 
    TF(nodeF.append([]),nodeT.append([]) , i = i + 1) #append T , F in the false node 

我的問題很簡單list.append(something)在python中返回「None」,所以一旦函數被再次調用(TF(None,None,1))None.append不存在。

我該如何解決這個問題?提前致謝。

此外,如果您有關於如何使這更有效,或者以另一種方式的任何建議(從來沒有來測試我的代碼,所以我不知道它會怎麼做)

(我的最終目標是有一個真正的假地圖和參數,因此:「FTFTFFFTFTF」帶來了字母「M」等)

+1

你願意就用這個解釋一下? – 2009-12-16 22:38:34

+2

請不要將其他語言的代碼轉譯成Python。請嘗試考慮Python的實際工作方式;請考慮算法的實際工作原理。然後 - 理解後 - 編寫Python。只需用Python令牌代替C語言令牌就很少能讓你使用Python。 – 2009-12-17 12:50:40

+1

這是我討厭python和IMO的事情之一,是完全不歧視的。任何改變'self'的方法都應該返回'self'。任何改變任何東西的函數都應該返回那個東西。 – DylanYoung 2016-10-03 18:26:22

回答

15

爲了解決您的具體問題,你可以這樣做:

def list_append(lst, item): 
    lst.append(item) 
    return lst 

然後list_append(lst, item)item附加到lst,然後返回lst

+0

+1可能不會比這更好 – 2009-12-16 22:36:46

3

您可以附加,然後再通過參考:

nodeT.append([]) 
TF(nodeT, nodeT, i + 1) 

但你的函數是沒有意義的我。即使它確實有意義,它也會導致TF的2 ** 35函數調用,這需要很長時間才能完成。

1

有更好的方法來創建一個二叉樹,但我不明白你想用它做什麼。

下面是代碼:

>>> def tree(i): 
    if i == 0: 
     return ['T', 'F'] 
    return [tree(i-1), tree(i-1)] 

>>> tree(3) 
[[[['T', 'F'], ['T', 'F']], [['T', 'F'], ['T', 'F']]], [[['T', 'F'], ['T', 'F']], [['T', 'F'], ['T', 'F']]]] 
4

不要添加到列表中,創建它們。 Python有自定義的數據結構BTW:P

class BinTree(object): 
    def __init__(self, left=None, right=None): 
     self.left = left 
     self.right = right 
    def __str__(self): 
     return " (%s, %s) " % (self.left, self.right) 

def maketree(depth): 
    if depth == 0: 
     return BinTree(True, False) 
    return BinTree(
     maketree(depth-1), 
     maketree(depth-1)) 

print maketree(4) 

如果你真的,真的要列出然後用[x,y]

11

更換BinTree(x, y)在Python中你可以使用「+」操作符來contatenate兩個列表離開原件不變。我想這就是你想根據你的問題標題來做什麼。因此

[1, 2] + [3] 

將返回

[1, 2, 3] 

所以你可以用它更多的是 「功能性的時尚」。 以防萬一你需要它

[1, 2].__add__([3]) 

是相當於以前的表達式。

+0

這是對OP原始意圖最正確的答案。添加更多代碼以便首先進行分配,然後返回參考是不必要的樣板。順便說一句,是否有相當於返回'.extend()'的結果? – javadba 2017-05-07 01:12:47

+0

據我瞭解'.extend()'相當於'+'或'__add__',但它改變了列表中的位置。當你想保留原件時不要使用'extend()'。 – csierra 2017-05-08 06:19:01

1

添加到@csierra的回答 - 我upvoted作爲最直接的answring OP:所述

+ [a,b] 

(與周圍的加數單個托架)是像list.extend([a,b])

 [ 1, 2, 3,4] + [5,6] 

缺貨[6]:[1,2,3,4,5,6]

鑑於

+ [[a,b]] 

(雙括號)就像list.append([a,b])

In [5]:  [ 1, 2, 3,4] + [[5,6]] 
Out[5]: [1, 2, 3, 4, [5, 6]]