Как сохранить копию словаря с замененными элементами? - PullRequest
0 голосов
/ 29 мая 2018

Функция swap_elements должна поменять местами элементы в dict и сохранить моментальные снимки результирующего dict, прежде чем поменять местами элементы обратно, чтобы сохранить исходную целостность.

Например:

swap_elements({0: [1, 2], 1: [3, 4]}, [(0, 1), (1, 0)], (0, 0))

Должен вернуть

{'entry 0': {0 :[2, 1], 1: [3, 4]},
 'entry 1': {0: [3, 2], 1: [1, 4]}

Вот код.

def swap_elements(grid, new_positions, current_x_y):
    modified_grids_1 = {}
    i = 0
    # original = grid
    for pos in new_positions:
        # print(pos[0], pos[1], current_x_y[0], current_x_y[1])
        # print(grid[pos[0]][pos[1]], grid[current_x_y[0]][current_x_y[1]])
        grid[pos[0]][pos[1]], grid[current_x_y[0]][current_x_y[1]] = grid[current_x_y[0]][current_x_y[1]], grid[pos[0]][pos[1]]
        # print_grid(grid)

        modified_grids_1.update({"entry "+str(i): grid})
        # print_grid(modified_grids[i])
        i += 1
        grid[current_x_y[0]][current_x_y[1]], grid[pos[0]][pos[1]] = grid[pos[0]][pos[1]], grid[current_x_y[0]][current_x_y[1]]
        # print_grid(grid)
    print(modified_grids_1)
    # for k in modified_grids.keys():
    #     print_grid(modified_grids.get(k))
    return modified_grids_1

Я получил измененное значение сетки, правильно вставленное в словарь modified_grids_1 в цикле for.Но вне цикла for все значения элемента, вставленные в цикл for, возвращаются к исходному значению.

1 Ответ

0 голосов
/ 29 мая 2018

Ваша ошибка связана с тем, что dict является изменяемым.То, что вы пытаетесь сделать, это:

  1. Поменять местами два элемента

  2. Получить снимок сетки с замененными элементами

  3. Поменять местами элементы.

Хотя, если в качестве снимка вы используете тот же dict вместо копии, при возврате назад вы также меняете местами элементыв снимке.

Вместо этого вам нужно сделать следующее:

  1. Сделать копию вашей сетки

  2. Поменять местами элементыв копии

Чтобы сделать это, используйте copy.deepcopy.

import copy

def swap_elements(grid, new_positions, current_x_y):
    modified_grids_1 = {}

    for i, pos in enumerate(new_positions):

        # Make a copy of the grid beforehand
        modified_grid = copy.deepcopy(grid)

        modified_grid[pos[0]][pos[1]], modified_grid[current_x_y[0]][current_x_y[1]] = grid[current_x_y[0]][current_x_y[1]], grid[pos[0]][pos[1]]

        modified_grids_1["entry "+str(i)] = copy.deepcopy(modified_grid)

    print(modified_grids_1)

    return modified_grids_1

swap_elements({0: [1, 2]}, [(0,0)], (0, 1))  # {'entry 0': {0: [2, 1]}}

Обратите внимание, что я также добавил некоторые улучшения, такие как enumerate, чтобы отслеживатьваш номер записи вместо инкрементной переменной и использование назначения элемента вместо dict.update.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...