TypeError:类型'实例'的参数是不可迭代的

时间:2013-01-29 18:35:38

标签: python python-2.7 depth-first-search pacman

所以继承我的代码,它突破了界限:

 if (suc not in sFrontier) or (suc not in sExplored):

给出错误:TypeError:类型'instance'的参数不可迭代

 """
    The pseudocode I'm following
initialize the frontier using the initial state of the problem
initialize the explored set to be empty
loop do
    if the frontier is empty then return failure
    choose a leaf node and remove it from the frontier
    if the node contains a goal state then return the corresponding solution
    add the node to the explored set
    expand the chosen node, adding the resulting nodes to the frontier
        only if not in the frontier or explored set
"""

sFrontier = util.Stack()
sFrontier.push(problem.getStartState())
sExplored = util.Stack()
lSuccessors = []

while not sFrontier.isEmpty():
  leaf = sFrontier.pop()

  if problem.isGoalState(leaf):
    solution = []
    while not sExplored.isEmpty():
      solution[:0] = (sExplored.pop())[2]
      return solution
  sExplored.push(leaf)
  lSuccessors = problem.getSuccessors(leaf)
  for suc in lSuccessors:
      if (suc not in sFrontier) or (suc not in sExplored):
        sFrontier.push(suc)
return []

problem.getSuccessors返回后续状态列表,它们需要的操作以及成本1.

所以

之后
lSuccessors = problem.getSuccessors(leaf)

lSuccessors打印

  [((5,4), 'South', 1), ((4,5), 'West', 1)]

之后

  for suc in lSuccessors:

成功打印

  ((5,4), 'South', 1)

为什么会破裂?是因为sFrontier和sExplored是堆栈而且无法查看堆栈?

我需要一个contains()方法,还是仅使用一个列表?

所有帮助表示赞赏:)

4 个答案:

答案 0 :(得分:2)

我认为util.Stack是你的班级。

提供__contains__(self, x)方法,使对象支持a in obj次检查。

请参阅文档:Emulating container types

答案 1 :(得分:2)

如果您的堆栈不支持包含测试,它确实会抛出错误。您需要向其添加__contains__ method以支持in测试。

in测试可以通过其他方式查找堆栈中的项目,但不推荐使用它们,因为它们的效率低于__contains__方法;请参阅in expression documentation

答案 2 :(得分:1)

SFrontier是一个包含列表的类。您在代码中检查是否在sFrontier类中是否为suc,因为sFrontier不可迭代,因此您无法检查它。您必须编写(suc in sFrontier.list),以便检查您的类sFrontier包含的列表中是否包含suc。

答案 3 :(得分:-1)

问题出在if案例的第一面:

if (succ not in sFrontier)

因此,您将sFrontier初始化为Stack,但Stack是一个类,并且类不可迭代。您的类必须在其中包含一个列表,以便它可以作为容器。如果是这样的话你需要做的是:

if (succ not in sFrontier.list)