【问题标题】:TypeError: 'Node' Object is not iterableTypeError:“节点”对象不可迭代
【发布时间】:2019-08-15 06:09:11
【问题描述】:

所以我创建了这个节点类,它有一个子节点数组。现在我想遍历孩子以找到所有可能路径中成本/价值最小的总和。我正在应用深度优先搜索策略。但是在我的一个孩子经历了一次交互之后,我收到一个 TypeError 说“无法迭代 NodeType”

class Node:
    def __init__(self, cost):
        self.cost= cost
        self.children = None

    def get(self):
        return self.cost

    def findMinPath(self):
        min_val = 10000
        if self.children is None:
            return self.cost
        for child in self.children:
            temp = child.findMinPath()
            if temp<min_val:
                min_val=temp
        return min_val+self.cost

if __name__ =='__main__':
    newnode = Node(0)
    nodeleft= Node(5)
    nodecenter=Node(3)
    noderight=Node(6)
    newnode.children={nodeleft,nodecenter,noderight}
    nodeleft.children=(Node(4))
    Nodecenterleft =Node(2)
    Nodecenterright = Node(0)
    nodecenter.children={Nodecenterleft,Nodecenterright}
    Nodecenterleftleft=Node(1)
    Nodecenterleft.children ={Nodecenterleftleft}
    Nodecenterleftleftright= Node(1)
    Nodecenterleftleft.children={Nodecenterleftleftright}
    Nodecenterrightleft = Node(10)
    Nodecenterright.children={Nodecenterrightleft}
    Noderightleft=Node(1)
    Noderightright=Node(5)
    noderight.children ={Noderightleft,Noderightright}
    print (newnode.findMinPath())

堆栈跟踪如下:

Traceback(最近一次调用最后一次): 文件“/Users/yashshah/Desktop/Initializer/tree.py”,第 45 行,在 打印 (newnode.findMinPath()) 文件“/Users/yashshah/Desktop/Initializer/tree.py”,第 17 行,在 findMinPath 中 temp = child.findMinPath() 文件“/Users/yashshah/Desktop/Initializer/tree.py”,第 16 行,在 findMinPath 中 对于self.children中的孩子: TypeError:“节点”对象不可迭代 [0.094s完成]

【问题讨论】:

  • 您能否提供一个堆栈跟踪,并且由于您的代码没有行号,请告诉我们错误发生在哪一行?
  • 有什么理由用 Java 标记这个问题?
  • 是的,我是新来的@Karthik
  • @Steve Yeah Traceback(最近一次通话最后):文件“/Users/yashshah/Desktop/Initializer/tree.py”,第 45 行,在 print (newnode.findMinPath())文件“/Users/yashshah/Desktop/Initializer/tree.py”,第 17 行,在 findMinPath 中 temp = child.findMinPath() 文件“/Users/yashshah/Desktop/Initializer/tree.py”,第 16 行,在 findMinPath 中self.children 中的子项:TypeError:'Node' 对象不可迭代 [在 0.094 秒内完成]

标签: python


【解决方案1】:

这一行是错误的:

nodeleft.children = (Node(4))

必须是:

nodeleft.children = {Node(4)}

由于您可以在任何表达式周围加上括号,因此 Python 无法确定您的意思是使用您的版本创建一个元组。所以你的行是一样的:

nodeleft.children = Node(4)

正如我希望您已经看到的那样,您的代码最终会认为它正在迭代 Node 对象的集合,但它实际上是在尝试迭代单个 Node 对象,这不合理。

【讨论】:

  • 感谢您指出。错误是我应该做 nodeleft.children={Node(4)}
  • 顺便说一句,我认为您可以使用元组而不是集合,因为您从未测试过成员资格。如果您不需要这样做,则可以使用元组,这样迭代起来会更快。但也许您想稍后在这些节点上进行查找,这可能对您正在做的事情没有任何影响。
  • 我用了元组,用了 0.156s 而用 set 用了 0.142s
  • 嗯。有趣的。好吧,那你就对了。我没想到会这样。
  • 谢谢!无缘无故地敲了我的头将近 20 分钟
猜你喜欢
  • 2013-09-01
  • 2017-08-27
  • 2018-10-10
  • 2021-12-13
  • 2019-02-20
  • 2020-03-27
  • 2018-12-12
  • 2018-07-16
  • 2011-09-12
相关资源
最近更新 更多