Python словарь не обновляется, как ожидалось в цикле

Я пытаюсь создать словарь, который обобщает другой. Я хотел бы, чтобы summary_dict обновлялся только тогда, когда ключ соответствует "родительскому" значению в details_dict. То, что я написал, похоже, не имеет доступа к summary_dict, как я ожидал. Операторы печати показывают, что он продолжает добавлять к первой итерируемой в цикле, вместо того, чтобы извлечь правильное значение из summary_dict.

detail_dict = {'a123': {"data": [1, 2, 3, 4], "parent": "a"},
               'a124': {"data": [1, 2, 3, 4, 5], "parent": "a"},
               'b123': {"data": [1, 2, 3], "parent": "b"},
               'b124': {"data": [1], "parent": "b"}}

summary_dict = dict.fromkeys(["a", "b"], {"data": [],
                                          "data_len": []})

for k, v in detail_dict.iteritems():
    summary_dict[v['parent']]["data"].append(v["data"])
    summary_dict[v['parent']]["data_len"].append(len(v["data"]))
    print "\nMy value is "
    print v
    print "\nMy summary dictionary now looks like:"
    print summary_dict[v['parent']]

Результирующий словарь, который я хотел бы:

{"a": {"data": [[1, 2, 3, 4], [1, 2, 3, 4, 5]],
       "data_len": [4, 5]},
 "b": {"data": [[1, 2, 3], [1]],
       "data_len": [3, 1]}}

2 ответа

Решение

Вы передаете изменяемый параметр from_keys поэтому ссылка копируется между ключами.

Создайте свой dict как этот вместо этого, чтобы создать один отдельный ref для каждого ключа:

summary_dict = {x : {"data": [],"data_len": []} for x in ["a","b"]}

обратите внимание, что, поскольку порядок указания не гарантирован, вы получите что-то вроде:

{'a': {'data_len': [5, 4], 'data': [[1, 2, 3, 4, 5], [1, 2, 3, 4]]}, 'b': {'data_len': [3, 1], 'data': [[1, 2, 3], [1]]}}

вы могли бы использовать

for k, v in sorted(detail_dict.items()):

сортировать элементы так, чтобы порядок в списке был детерминированным.

dict.fromkeys Метод использует один и тот же экземпляр для каждого значения.

summary_dict = dict.fromkeys(["a", "b"], {"data": [], "data_len": []})

Изменение словаря для одного ключа повлияет на все ключи. Лучше всего использовать dict.fromkeys только с неизменяемым объектом для значения по умолчанию, чтобы избежать этой ловушки.

Вместо этого попробуйте это понимание:

summary_dict = {k: {"data": [], "data_len": []} for k in 'ab')
Другие вопросы по тегам