как обойти 'словарь изменил размер во время итерации' - PullRequest
0 голосов
/ 12 января 2019

Я пишу эвристическую функцию для задачи, которая может быть представлена ​​в виде таблицы (кортежа кортежей), и я начинаю с некоторых случайных ячеек в моей таблице, которым я даю значение 0, затем добавляю 1 к ее соседей и т. д. - это значение позже может быть показано в словаре - где ключ - это координаты ячейки, а значение - ее значение. каждый раз, когда я попадаю в новую камеру, я сохраняю ее в свой диктофон.

Проблема - для этого метода BFS, который я сделал, мне нужен словарь динамического размера. Есть несколько начальных ключей, когда я начинаю итерацию, затем добавляются другие, когда код выполняется - и код должен также проверять эти новые ячейки. Хотя я думал, что 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

Я ожидаю, что он действительно изменит размер и продолжит работу во время итерации. Есть ли способ сделать это?

1 Ответ

0 голосов
/ 12 января 2019

Вы можете поддерживать очередь для посещаемых ячеек и отдельный словарь, в котором указано состояние каждой ячейки:

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

    if STATEMENT:
        visitedCells[row + 1, col] = val + 1
        queue.append((row + 1, col))
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...