#python #dictionary #format
Вопрос:
Как я мог отказаться от этого формата словаря
{'A.B': 7, 'C.D': 5, 'A.D': 34}
к этому:
{'A': {'B':7, D:34} , 'C': {'D': 5} }
Значение ключа «A. B» заключается в том, что я перехожу из A в B, и его значение означает 7 раз, поэтому я пытаюсь изменить этот формат, чтобы мой ключ словаря был там, откуда я иду, и его значение-это словарь с его пунктами назначения (один или несколько) и временем каждого.
Я пробовал несколько вещей, но пока ничего не получается.
Я пробовал использовать for с новым словарем, но он переопределяет мои ключи.
Комментарии:
1. Будет ли глубина клавиш всегда равна 2 или
A.B.C
возможен подобный ключ?
Ответ №1:
Использование defaultdict:
d = {'A.B': 7, 'C.D': 5, 'A.D': 34}
from collections import defaultdict
formatted_d = defaultdict(dict)
for k, v in d.items():
top_key, bottom_key = k.split('.')
formatted_d[top_key][bottom_key] = v
Без дефолта:
formatted_d = {}
for k, v in d.items():
top_key, bottom_key = k.split('.')
if top_key not in formatted_d:
formatted_d[top_key] = {}
formatted_d[top_key][bottom_key] = v
Комментарии:
1. Ах, та же идея, всего несколькими минутами ранее — 1.
Ответ №2:
Чистый и простой для понимания с collections.defaultdict
:
from collections import defaultdict
dct = {'A.B': 7, 'C.D': 5, 'A.D': 34}
new_dict = defaultdict(dict)
for key, value in dct.items():
root, descendant = key.split(".")
new_dict[root][descendant] = value
print(new_dict)
Это дает
defaultdict(<class 'dict'>, {'A': {'B': 7, 'D': 34}, 'C': {'D': 5}})
Ответ №3:
Быстрый подход:
d = {'A.B': 7, 'C.D': 5, 'A.D': 34}
dicts_init = {key.split('.')[0]: {} for key, value in d.items()}
for key, value in d.items():
root_k, val = key.split(".")
dicts_init[root_k][val] = value
print(dicts_init)
Выходы:
{'A': {'B': 7, 'D': 34}, 'C': {'D': 5}}
Комментарии:
1. и как бы вы вставили сюда данные {‘A’: {}, ‘B’: {}}, используя для без переопределения, просто добавив больше к ключу, например, список {‘A’: {‘C’:1,’D’:4}, ‘B’: {} }
2. Не совсем понимаю, что ты имеешь в виду. но просто:
dicts_init[root_k][val] = value
Вы не можете использовать один и тот же ключ в dict.
Ответ №4:
d = {'A.B': 7, 'C.D': 5, 'A.D': 34}
result = {}
for key in d:
current, destination = key.split('.')
times = d.get(key)
if current not in result.keys():
result[current] = {destination: int(times)}
else:
result[current][destination] = int(times)
print(result)
Комментарии:
1. Вы не должны использовать
input
в качестве имени переменной. Это имя встроенной функции: docs.python.org/3/library/functions.html#input