[Python-3]类型错误:必须是字符串,而不是整数。

3

我遇到了关于解析树(Parse Tree)代码的问题。当我尝试使用后序遍历(post-order)来显示它时,会出现错误提示,提示中应该是参数应该是str而不是int

from classStack import Stack
from classTree import BinaryTree

def buildParseTree(fpexp):
    fplist = fpexp.split()
    pStack = Stack()
    eTree = BinaryTree('')
    pStack.push(eTree)
    currentTree = eTree
    for i in fplist:
        if i == '(':
            currentTree.insertLeft('')
            pStack.push(currentTree)
            currentTree = currentTree.getLeftChild()

        elif i not in ['+', '-', '*', '/', ')']:
            currentTree.setRootVal(int(i))
            parent = pStack.pop()
            currentTree = parent

        elif i in ['+', '-', '*', '/']:
            currentTree.setRootVal(i)
            currentTree.insertRight('')
            pStack.push(currentTree)
            currentTree = currentTree.getRightChild()

        elif i == ')':
            currentTree = pStack.pop()

        else:
            raise ValueError("No se contempla el carácter evaluado")

    return eTree

ParseTree = buildParseTree("( 8 * 5 )")
ParseTree.printPostordenTree(0)

错误:

Traceback (most recent call last):
  File "C:\Users\Franco Calvacho\Downloads\Árboles\parseTree.py", line 38, in <module>
    ParseTree.printPostordenTree(0)
  File "C:\Users\Franco Calvacho\Downloads\Árboles\classTree.py", line 62, in printPostordenTree
    self.getLeftChild().printPostordenTree(n+1)
  File "C:\Users\Franco Calvacho\Downloads\Árboles\classTree.py", line 67, in printPostordenTree
    print("Level: "+ str(n) + " " + self.getRootVal())
TypeError: must be str, not int
[Finished in 0.2s]

这是二叉树的代码。我想强调的是,仅有这份二叉树的代码是没有问题的,不会出现错误信息。在该代码下方,我留下了Python注释以供您查看
class BinaryTree(object):
    def __init__(self, data): 
        self.key = data
        self.leftChild = None 
        self.rightChild = None 

    def insertLeft(self, newNode): 
        if self.leftChild == None:  
            self.leftChild = BinaryTree(newNode) 
        else: 
            t = BinaryTree(newNode) 
            t.leftChild = self.leftChild 
            self.leftChild = t 

    def insertRight(self, newNode): 
        if self.rightChild == None:
            self.rightChild = BinaryTree(newNode)
        else: 
            t = BinaryTree(newNode)
            t.rightChild = self.rightChild
            self.rightChild = t 

    def getRightChild(self):
        return self.rightChild

    def getLeftChild(self):
        return self.leftChild

    def setRootVal(self, obj): 
        self.key = obj

    def getRootVal(self):
        return self.key     

    def printPreordenTree(self, n): 
        if self.getRootVal() != None: 
            print("Level: "+ str(n) + " " + self.getRootVal())
            n+=1 

            if self.getLeftChild() != None:
                self.getLeftChild().printPreordenTree(n) 

            if self.getRightChild() != None:
                self.getRightChild().printPreordenTree(n) 
        return n 

    def printInordenTree(self, n): 
        if self.getRootVal() != None: 
            if self.getLeftChild() != None: 
                self.getLeftChild().printInordenTree(n+1) 

            print("Level: "+ str(n) + " " + self.getRootVal())
            n+=1 

            if self.getRightChild() != None: 
                self.getRightChild().printInordenTree(n) 
        return n 

    def printPostordenTree(self, n):
        if self.getRootVal() != None:
            if self.getLeftChild() != None:
                self.getLeftChild().printPostordenTree(n+1)

            if self.getRightChild() != None:
                self.getRightChild().printPostordenTree(n+1) 

            print("Level: "+ str(n) + " " + self.getRootVal())
            n+=1 
        return n 

"""a = BinaryTree("a")
a.insertLeft("b") 
a.insertRight("c") 
a.getLeftChild().insertLeft("d") 
a.getRightChild().insertLeft("e") 
a.getRightChild().insertRight("f") 
print("Imprimo el árbol de forma Preorden")
a.printPreordenTree(0)
print("\nImprimo el árbol de forma Inorden")
a.printInordenTree(0)
print("\nImprimo el árbol de forma Postorden")
a.printPostordenTree(0)"""

3
可能是在Python中将字符串和整数组合成一个字符串的重复问题。 - OneCricketeer
1
在有问题的那一行,self.getRootVal() 可能会返回一个整数。 - Jared Smith
currentTree.setRootVal(int(i)) 将根节点设置为整数。self.getRootVal() 返回 Jared 上面所说的整数。问题可能是一开始将其设置为整数,而节点需要是字符串。 - AnnanFay
1个回答

6
print("Level: "+ str(n) + " " + self.getRootVal())
TypeError: must be str, not int

这是错误的解释:您只能使用“+”运算符将字符串附加到字符串,而不能将整数附加到字符串。 前三个参数是字符串,但self.getRootVal()不是。
第一种可能的解决方案:像您对n所做的那样将其强制转换为str。
print("Level: "+ str(n) + " " + str(self.getRootVal()))

或者,您可以使用格式化字符串:

print("Level: {} {}".format(n, self.getRootVal()))

后者不需要您将参数转换为字符串,而且可读性更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接