执行dict [k]时,由dict.keys()返回的密钥k导致KeyError:现有密钥上的KeyError

m0meni

以下代码

for k in list(g_score.keys()):
    print(g_score[k])

KeyError为我返回一个

Traceback (most recent call last):
  File "./np.py", line 134, in <module>
    main()
  File "./np.py", line 131, in main
    NPuzzle(n).solve()
  File "./np.py", line 116, in solve
    print(g_score[k])
KeyError: 3

我不知道什么时候print(list(g_score.keys()))可能[4, 3, 7]3显然在字典中。


对于上下文,我正在尝试对N-Puzzle问题实施A *搜索(并且我什至不确定A *是否正确实施,因为我无法克服此错误),并具有以下State类和solve功能:

class State:
    def __init__(self, blank_idx, puzzle, g=0, h=0):
        self.blank_idx = blank_idx
        self.puzzle = puzzle
        self.f = g + h

    def __eq__(self, other):
        return self.puzzle == other.puzzle

    def __hash__(self):
        return self.f + self.blank_idx

    def __lt__(self, other):
        return self.f < other.f

    def __repr__(self):
        return str(self.f)

...

class NPuzzle:

    # ...other stuff

    def solve(self):
      start_state = State(
          self.puzzle.index(' '),
          self.puzzle,
          0,
          self.cost(self.puzzle)
      )

      g_score = {start_state: 0}
      open_set = [start_state]
      path = {}

      while open_set:
          state = open_set[0]

          if state.puzzle == self.goal_state:
              break

          heappop(open_set)
          for next_state in self.neighbors(state):
              g = g_score[state] + 1
              if next_state in g_score and g >= g_score[next_state]:
                  continue

              path[next_state] = state
              g_score[next_state] = g
              next_state.f = g + self.cost(next_state.puzzle)
              heappush(open_set, next_state)

我首先在我所在的行上遇到了错误:

g = g_score[state] + 1

我不确定为什么会这样KeyError,但是我假设这可能与我的自定义__hash()__函数有关。

m0meni

好的,事实证明,问题在于我立即更改State了哈希函数所依赖实例的属性... oops:

我的__hash()__功能State是:

return self.f + self.blank_idx

我被存储方式Stateg_score低于:

g_score[next_state] = g
next_state.f = g + self.cost(next_state.puzzle)

原来上面休息的一切,因为它使用next_state.fnext_stateg_score,但随后立即到下一行我发生变异next_state.f

像这样切换两个语句的顺序:

next_state.f = g + self.cost(next_state.puzzle)
g_score[next_state] = g

解决我的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章