Грешка в типа рекурсия на списък на Python

Решен: Изглежда, че проблемът възниква само с PythonWin. Проведох всичко през Python shell на IDLE и работи добре. Трябва да е грешка в PythonWin, а не в самия код.

Изглежда не мога да разбера защо следният код ми дава TypeError: 'type' object is not iterable

pastebin: http://pastebin.com/VFZYY4v0

def genList(self):
    #recursively generates a sorted list of child node values
    numList = []
    if self.leftChild != 'none':
        numList.extend(self.leftChild.genList())  #error
    numList.extend(list((self.Value,)))
    if self.rightChild != 'none':
        numList.extend(self.rightChild.genList()) #error
    return numList

код, който добавя дъщерни възли (работи правилно)

def addChild(self, child):
    #add a child node. working
    if child.Value < self.Value:
        if self.leftChild == 'none':
            self.leftChild = child
            child.parent = self
        else:
            self.leftChild.addChild(child)
    elif child.Value > self.Value:
        if self.rightChild == 'none':
            self.rightChild = child
            child.parent = self
        else:
            self.rightChild.addChild(child)

Всяка помощ ще бъде оценена.

Пълна интерпретаторска сесия: ››› импортиране на BinTreeNode като BTN
››› node1 = BTN.BinaryTreeNode(5)
››› node2 = BTN.BinaryTreeNode(2)
››› node3 = BTN.BinaryTreeNode(12)
››› възел3 = BTN.BinaryTreeNode(16)
››› възел4 = BTN.BinaryTreeNode(4)
››› възел5 = BTN.BinaryTreeNode(13 )
››› node1.addChild(node2)
››› node1.addChild(node3)
››› node1.addChild(node4)
››› node1.addChild (node5)
››› node4.genList()
‹class 'list'›
››› node1.genList()
Проследяване (последното последно извикване):< br /> Файл „‹interactive input›“, ред 1, в ‹module›
Файл „C:...\python\BinTreeNode.py“, ред 47, в genList
numList.extend( self.leftChild.genList()) #грешка
Файл "C:...\python\BinTreeNode.py", ред 52, в genList
TypeError: обектът 'type' не може да се повтори


person Jacob J Callahan    schedule 01.12.2012    source източник
comment
Можете ли да публикувате цялата грешка? Или повече код. Как се генерират leftChild и rightChild?   -  person jgritty    schedule 01.12.2012
comment
@JacobJCallahan: Моля, актуализирайте въпроса си с цялата подходяща информация.   -  person jdi    schedule 01.12.2012
comment
ето пълната грешка: Traceback (последното последно извикване): Файл ‹interactive input›, ред 1, в ‹module› Файл C:\...\python\BinTreeNode.py, ред 47, в genList numList.extend( self.leftChild.genList()) #error Файл C:\...\python\BinTreeNode.py, ред 52, в genList TypeError: 'type' object is not iterable   -  person Jacob J Callahan    schedule 01.12.2012
comment
@JacobJCallahan не публикувайте информацията в коментари, където не можете да я форматирате правилно. Редактирайте въпроса си.   -  person Mark Reed    schedule 01.12.2012
comment
благодаря, Марк. нови за този сайт.   -  person Jacob J Callahan    schedule 01.12.2012
comment
От предоставения от вас код изглежда, че numList.extend() винаги ще получава екземпляр на списък. Имам чувството, че това ще бъде разрешено само като видя целия код :-/   -  person jdi    schedule 01.12.2012
comment
@jdi това е смисълът на тази функция. основно за връщане на сортиран списък от двоично дърво. бих извикал функцията от горния възел и тя рекурсивно ще генерира сортирания списък.   -  person Jacob J Callahan    schedule 01.12.2012
comment
numList.extend(list((self.Value,))) изглежда, че трябва да е само numList.append(self.Value) ... (това не е ваш проблем, но би било по-малко объркващо) -- Да не сте засенчвали вградения list нали?   -  person mgilson    schedule 01.12.2012
comment
@mgilson, който всъщност ще върне int и ще има подобна грешка. TypeError: 'type' int не може да се повтаря   -  person Jacob J Callahan    schedule 01.12.2012
comment
@JacobJCallahan: Това не изглежда правилно. Има нещо подозрително тук.   -  person jdi    schedule 01.12.2012
comment
Предполагам, че публикувам целия BinTreeNode.py   -  person jgritty    schedule 01.12.2012
comment
@JacobJCallahan -- Не, ще върне списък с 1 елемент в него. Както е, вие конструирате кортеж от 1 елемент, преобразувате го в списък и след това го използвате, за да разширите списъка, който имате. Това е точно същото като добавянето на 1 елемент към списъка, който имате.   -  person mgilson    schedule 01.12.2012
comment
@jgritty: Не, това е грешно. Това би добавило вложен списък, което не е това, което OP би искала.   -  person jdi    schedule 01.12.2012
comment
@jdi ред 52 всъщност е само интервал преди следващата деф на ред 53   -  person Jacob J Callahan    schedule 01.12.2012
comment
@jgritty, това е различно от това, което OP прави сега. Опитайте: a = []; a.extend(list((1,))); print(a) ви дава [1], а не [[1]]   -  person mgilson    schedule 01.12.2012
comment
Мразя да го казвам...но дори и с този дневник на преводача пак няма смисъл. Във вашия genList() метод няма нищо, което да показва, че връщате тип вместо екземпляр на списък. И все пак изходът ви показва, че genList() връща тип клас.   -  person jdi    schedule 01.12.2012
comment
@jdi точно... не мога да разбера защо не връща действителния списък.   -  person Jacob J Callahan    schedule 01.12.2012
comment
Ще тествам кода ви, ако публикувате работеща версия.   -  person jdi    schedule 01.12.2012
comment
добави връзка към pastebin за вас   -  person Jacob J Callahan    schedule 01.12.2012
comment
Примерният код изглежда работи добре за мен, Python 2.7.3 на Windows.   -  person jgritty    schedule 01.12.2012
comment
Работи добре в Python 3.3. Наистина ли използвате Python 3.0?   -  person jdi    schedule 01.12.2012
comment
корекция 3.2.2. Утре ще пробвам и други неща, благодаря   -  person Jacob J Callahan    schedule 01.12.2012
comment
Работи добре и за мен на 3.2   -  person jgritty    schedule 01.12.2012


Отговори (2)


Във вашите примери няма нищо, което да показва откъде идва проблемът, но това, което означава, е, че по някакъв начин връщате тип обект, а не екземпляр на обект. Всичко, което мога да предложа на този етап, е да предложа друг начин за преработване на метода genList() и да видя дали магически ще коригира проблема ви.

Можете да опитате да прехвърлите същия списък с резултати през рекурсията, вместо да връщате много временни:

def genList(self, numList=None):
    if numList is None:
        numList = []

    if self.leftChild != 'none':
        self.leftChild.genList(numList)

    numList.append(self.Value)

    if self.rightChild != 'none':
        self.rightChild.genList(numList)

    return numList

results = rootNode.genList()

Също така, има ли причина да използвате 'none' вместо None? Просто бих използвал None вместо низ.

Предложените от мен редакции на вашата версия са тук: http://pastebin.com/FGf8Lcdu

И ето изхода от същия код на вашия интерпретатор, под python3.3:

In [1]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:>>> import BinTreeNode as BTN
:>>> node1 = BTN.BinaryTreeNode(5)
:>>> node2 = BTN.BinaryTreeNode(2)
:>>> node3 = BTN.BinaryTreeNode(12)
:>>> node3 = BTN.BinaryTreeNode(16)
:>>> node4 = BTN.BinaryTreeNode(4)
:>>> node5 = BTN.BinaryTreeNode(13)
:>>> node1.addChild(node2)
:>>> node1.addChild(node3)
:>>> node1.addChild(node4)
:>>> node1.addChild(node5)
:<EOF>

In [2]: node4.genList()
Out[2]: [4]

In [3]: node1.genList()
Out[3]: [2, 4, 5, 13, 16]
person jdi    schedule 01.12.2012
comment
Предложените от мен редакции на вашия pastebin: pastebin.com/FGf8Lcdu (Въпреки че работи добре за мен в python2.7.3 и python 3.3) - person jdi; 01.12.2012
comment
ще го направя. можете ли да поставите резултатите от интерпретатора си? можете да използвате същите обаждания, които направих аз. - person Jacob J Callahan; 01.12.2012
comment
Благодаря за цялата ви помощ @jdi - person Jacob J Callahan; 01.12.2012

Бих добавил няколко разпечатки, за да видя какъв е действителният тип, когато дава грешката, като:

def genList(self):
    #recursively generates a sorted list of child node values
    numList = []
    if self.leftChild != 'none':
        print self.leftChild.genList(), type(self.leftChild.genList())
        numList.extend(self.leftChild.genList())  #error
    numList.extend(list((self.Value,)))
    if self.rightChild != 'none':
        print self.rightChild.genList(), type(self.rightChild.genList())
        numList.extend(self.rightChild.genList()) #error
    return numList

Не толкова странно предположение... Опитайте вместо list((self.Value,)) да използвате [self.Value]. Имам чувството, че ще се получи... :-)

person vkontori    schedule 01.12.2012
comment
Пуснах командите през интерпретатора и се върнах, че те просто връщат тип списък по някаква причина тук е резултатът ‹class 'list'› - person Jacob J Callahan; 01.12.2012
comment
@JacobJCallahan: първият отпечатан елемент ли беше списъкът, или това беше вторият елемент? - person jdi; 01.12.2012
comment
@jdi това, което беше отпечатано, беше резултат от стартиране на genList() на възел без деца. така че проблемът изглежда е, че той връща типа вместо самия списък - person Jacob J Callahan; 01.12.2012
comment
освен това [self.Value] връща същото - person Jacob J Callahan; 01.12.2012
comment
@JacobJCallahan: Трябва да видим повече контекст, за да разберем какво не е наред тук. В настоящия ви пример няма нищо, което да показва къде би била грешката. - person jdi; 01.12.2012
comment
това е целият контекст, който е уместен. другият код се състои от други функции, които нямат проблеми - person Jacob J Callahan; 01.12.2012
comment
Ако другият код нямаше проблеми, нямаше да видите тази грешка. Установихме, че този ред numList.extend(list((self.Value,))) е някак странен, но изглежда прави правилното нещо. Освен това не ни давате много да продължим. - person jgritty; 01.12.2012
comment
@jgritty се надявам, че последната редакция ще помогне. това е всичко, което трябва да продължа - person Jacob J Callahan; 01.12.2012
comment
@JacobJCallahan: За съжаление не е така. Единственият ви избор е да публикувате целия си код в pastebin или нещо подобно. - person jdi; 01.12.2012