В списках Python добавляется возвращаемое значение

Я хотел создать простое двоичное дерево, следующее за этим изображением:

в основном пустые, но последние значения, поэтому я создал список корней:

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 не существует.

как я могу это решить? спасибо заранее.

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

(моя конечная цель - иметь карту True False и аргумент так: "FTFTFFFTFTF" выведет букву "M" и т.д.)

6 ответов

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

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

а затем list_append(lst, item) добавит item к lst и вернет lst.


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

[1, 2] + [3]

вернет

[1, 2, 3]

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

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

является эквивалентом выражения before.


Не добавляйте в список, создавайте их. Python имеет настраиваемые структуры данных: 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]


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

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

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


Добавление в ответ @csierra - который я рассмотрел как наиболее непосредственный ответ OP:

+ [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]]


Там лучший способ создать двоичное дерево, но я не мог понять, что вы хотите с ним сделать.

Вот код:

>>> 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']]]]

licensed under cc by-sa 3.0 with attribution.