2009-12-16 2 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 (что-то) в python возвращает «None», как только функция снова вызвана (TF (None, None, 1)) None.append не существует.

Как это решить? заранее спасибо.

также, если у вас есть какие-либо предложения о том, как сделать это более эффективным или по-другому (не должен проверить свой код, так что я не уверен, как он будет делать)

(моя конечная цель должна иметь Истинная Ложная карта и аргумент так: «FTFTFFFTFTF» появится буква «М» ... и т.д)

+1

Вы бы подробнее остановиться на использовании этого? –

+2

Пожалуйста, не транслитерируйте код с других языков на Python. Попробуйте подумать о том, как работает Python; подумайте о том, как работает алгоритм. Затем - после понимания - напишите Python. Просто замените токены на языке C языками с помощью токенов Python, которые редко дают вам рабочий Python. –

+1

Это одна из вещей, которые я ненавижу по поводу python, и IMO, совершенно бесстрашный. Любой метод, который мутирует 'self', должен возвращать' self'. Любая функция, которая мутирует что-либо, должна вернуть эту вещь. – DylanYoung

ответ

15

Чтобы решить точный вопрос вы можете сделать это:

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

и затем list_append(lst, item) приложит item к lst, а затем вернуть lst.

+0

+1 Вероятно, это не лучше, чем это –

3

Можно добавить первый, а затем передать ссылку:

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

Но ваша функция не имеет никакого смысла для меня. Даже если бы это имело смысл, это вызвало бы 2 ** 35 вызова функций TF, что потребовалось бы довольно долгое время.

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

Dont добавить к списку, создайте их. 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) 

Если вы действительно, действительно хотите списки затем заменить BinTree(x, y) с [x,y]

11

В питона вы можете использовать оператор «+», чтобы contatenate два списка оставляя оригиналы нетронутыми. Я думаю, это то, что вы хотите сделать в соответствии с вашим вопросом. Таким образом

[1, 2] + [3] 

вернется

[1, 2, 3] 

так что вы можете использовать его больше в "функциональной моде". Только в случае, если вам это нужно

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

эквивалентно выражению ранее.

+0

Это самый правильный ответ по оригинальному намерению OP. Добавление большего количества кода для первого выполнения задания, а затем возврат ссылки - ненужный шаблон. Btw есть эквивалент для возврата результата .extend() '? – javadba

+0

Насколько я понимаю, '.extend()' эквивалентен '+' или '__add__', но он изменяет список на месте. Если вы хотите оставить оригиналы нетронутыми, не используйте 'extend()'. – csierra

1

Добавление ответа @csierra «ы - что я upvoted как наиболее непосредственно answring ОР:

+ [a,b] 

(с одинарным кронштейном вокруг слагаемого), как list.extend([a,b])

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

Out [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]] 
Смежные вопросы