Python 如何绕过“迭代期间字典更改大小”

Python 如何绕过“迭代期间字典更改大小”,python,dictionary,heuristics,Python,Dictionary,Heuristics,我正在为一个问题编写一个启发式函数,这个问题可以由一个表(一个元组的元组)来表示,我从表中的一些随机单元开始,我给它一个0值,然后将1添加到它的邻居中,依此类推-这个值稍后可以在字典中显示-其中键是单元的坐标,值是它的值。每次我进入一个新的手机,我都会把它保存到我的dic里 问题是,对于我制作的这个BFS-ish方法,我需要一个动态大小的字典。当我开始迭代时,会有一些初始键,然后在代码运行时会添加更多的键——代码也需要检查这些新单元格。虽然我认为python能够处理这个问题,但我得到了一个运行时

我正在为一个问题编写一个启发式函数,这个问题可以由一个表(一个元组的元组)来表示,我从表中的一些随机单元开始,我给它一个0值,然后将1添加到它的邻居中,依此类推-这个值稍后可以在字典中显示-其中键是单元的坐标,值是它的值。每次我进入一个新的手机,我都会把它保存到我的dic里

问题是,对于我制作的这个BFS-ish方法,我需要一个动态大小的字典。当我开始迭代时,会有一些初始键,然后在代码运行时会添加更多的键——代码也需要检查这些新单元格。虽然我认为python能够处理这个问题,但我得到了一个运行时错误,即RuntimeError:字典在迭代过程中改变了大小

    visitedCells = dict()
    for row in range(len(node.state)):
        for cell in range(len(node.state[0])):
            if STATEMENT:
                visitedCells[row, cell] = 0

    for cell, val in visitedCells.items():
        row = cell[0]
        col = cell[1]

        if STATEMENT:
            visitedCells[row + 1, col] = val + 1
        if STATEMENT:
            visitedCells[row - 1, col] = val + 1
        if STATEMENT:
            visitedCells[row, col + 1] = val + 1
        if STATEMENT:
            visitedCells[row, col - 1] = val + 1

我希望它实际上改变大小并在迭代过程中继续。有什么方法可以做到这一点吗?

您可以为要访问的单元格维护一个队列和一个单独的字典,该字典指示每个单元格的状态:

queue = list(visitedCells.items())
while queue:
    row, col = queue.pop(0)

    if STATEMENT:
        visitedCells[row + 1, col] = val + 1
        queue.append((row + 1, col))
    ...

做在迭代过程中继续意味着如果创建了任何新的CEL,您也想访问它们吗?在迭代过程中,您是否打算多次访问cel?迭代顺序重要吗?我只想访问每个单元一次。我还想参观新的牢房。迭代顺序必须为BFSY您可能希望对队列使用collections.deque。使用此功能可以多次访问电池吗?@wwii如果性能重要,当然可以。如果一个单元格可以被多次访问取决于不同的语句,而算法没有阻止这种情况。OP只想在迭代过程中访问每个单元格一次,则不应盲目地将单元格添加到它们应该被限定的队列中。@wwii没问题,正如我提到的,添加到队列中的内容取决于该语句。您可以维护一个额外的集合,该集合指示某个单元格是否已被访问,并且仅当未访问该单元格时才将其添加到队列中。但根据问题的标题,这与如何绕过“迭代期间字典更改大小”无关。