Изменение формата словаря Python ключи разделения

#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