Установка значения во вложенном словаре устанавливает его более чем в одном месте - PullRequest
0 голосов
/ 10 июля 2020

Моя цель - добавить значение в список, который существует во вложенном словаре.

Я создал вложенный словарь рекурсивно, используя метод, который я написал. Мне нужен этот метод для создания словаря, потому что он может иметь любое количество «измерений».

def create_nested_dict(dimensions):
    if len(dimensions) == 1:
        return dict.fromkeys(range(dimensions[0]), [])
    else:
        return dict.fromkeys(range(dimensions[0]), create_nested_dict((dimensions[1:])))

Например, d = create_nested_dict([2, 3]) генерирует словарь d с ключами сначала в range(2), а затем в range(3). Примерно так:

{0: {0: [], 1: [], 2: []}, 1: {0: [], 1: [], 2: []}}

Однако теперь мне нужно добавить значения в списки, содержащиеся в словаре.

Если я попытаюсь добавить значение в список в позиции [0][1] вот так (d[0][1]).append(3), значение добавляется во все списки:

{0: {0: [3], 1: [3], 2: [3]}, 1: {0: [3], 1: [3], 2: [3]}}

Если я использую вместо этого оператор splat d[0][1] = [*d[0][1], 3]:

, я получаю такой результат:

{0: {0: [], 1: [3], 2: []}, 1: {0: [], 1: [3], 2: []}}

, что мне тоже не нужно.

Ожидаемый результат - получить значение, добавленное только к позиции [0][1]:

{0: {0: [], 1: [3], 2: []}, 1: {0: [], 1: [], 2: []}}

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

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Вот как это делается:

def create_nested_dict(dimensions):
    if len(dimensions) == 1:
        return {k: [] for k in range(dimensions[0])}
    return {k: create_nested_dict(dimensions[1]) for k in range(dimensions[1])}

Обратите внимание, что нам не нужен дополнительный оператор else в функции. операторов return достаточно.

0 голосов
/ 10 июля 2020

Когда вы выполняете dict.fromkeys(range(dimensions[0]), create_nested_dict((dimensions[1:]))), вы назначаете тот же dict, что и значение для всех ключей. Поскольку это один и тот же dict (т.е. это всего лишь 1 Python объект под капотом, и каждая запись в dict является ссылкой на этот же объект), изменение одного из них изменит их все.

Вам следует каждый раз создавать fre sh словарь, вы можете легко сделать это, используя понимание dict:

def create_nested_dict(dimensions):
    if len(dimensions) == 1:
        return {k: [] for k in range(dimensions[0])}
    else:
        return {k: create_nested_dict(dimensions[1:]) for k in range(dimensions[0])}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...