Я пытаюсь создать словарь, который резюмирует другой. Я хотел бы, чтобы 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]}}
Решение проблемы
вы передаете изменяемый параметр, from_keysпоэтому ссылка копируется между ключами.
Вместо этого создайте свой dict таким образом, чтобы создать отдельную ссылку для каждого ключа:
summary_dict = {x: {"data": [],"data_len": []} for x in ["a","b"]}
обратите внимание, что, поскольку порядок dict не гарантируется, вы получите что-то вроде:
{'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()):
для сортировки элементов, чтобы порядок в списке был детерминированным.
Комментариев нет:
Отправить комментарий