Списки Python добавляют возвращаемое значение - PullRequest
4 голосов
/ 17 декабря 2009

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

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

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

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

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

Ответы [ 7 ]

18 голосов
/ 05 июня 2013

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

[1, 2] + [3] 

вернется

[1, 2, 3]

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

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

эквивалентно предыдущему выражению.

17 голосов
/ 17 декабря 2009

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

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

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

4 голосов
/ 17 декабря 2009

Не добавлять в список, создавать их. 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]

3 голосов
/ 17 декабря 2009

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

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

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

1 голос
/ 08 мая 2017

Добавление к ответу @csierra - который я назвал самым прямым ответом на ОП:

+  [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]]
1 голос
/ 17 декабря 2009

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

Вот код:

>>> 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']]]]
0 голосов
/ 05 февраля 2019

Что ж, хотя приведенные выше ответы верны, другой хороший (но, возможно, не очень) способ сделать это - использовать тот факт, что append возвращает None:

func(l.append([]) is None and l[-1])

Что практически позволяет вам делать все, что вы хотите в одной строке с .append

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...