2009-12-16 67 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]]