Индексация списка во вложенных словарях
Решаю некоторую задачу, столкнулся с такой проблемой
Имеется вложенный словарь такого типа:
{1: {'some_str1': ['a', 'b']}, 2: {'some_str2': ['c', 'd', 'f']}
Нужно проиндексировать значения списка вложенного словаря, чтобы индексы были ключами
Пример:
{1: {'some_str1': {1: 'a', 2: 'b'}}, 2: {'some_str2': {3: 'c', 4: 'd', 5: 'f'}}}
Я пробовал решить используя dict comprehansion:
my_dict = {key_1: {key_2 : {index: key_3 for index, key_3 in enumerate(my_dict[key_1][key_2], 1)} for key_2 in my_dict[key_1]} for key_1 in my_dict}
но в таком случае вывод будет по типу:
{1: {'some_str1': {1: 'a', 2: 'b'}}, 2: {'some_str2': {1: 'c', 2: 'd', 3: 'f'}}}
Буду рад помощи!
Ответы (2 шт):
Автор решения: Sergey K.
→ Ссылка
Приведу решение с использованием самого тривиального варианта - создать новый словарь и наполнить его аналогичным содержимым через циклы.
# Исходные данные
source = {1: {'some_str1': ['a', 'b']}, 2: {'some_str2': ['c', 'd', 'f']}}
# Новый словарь, который будем наполнять
result = dict()
# Так как индексы от словаря к словарю не обнуляются, то нужно вынести из контекста цикла инициализацию
idx = 1
# Сначала пробегаемся по ключам самого верхнего уровня
for k in source:
# Создаём соответствующий вложенных словарь с таким же ключом
result[k] = dict()
# Проходим по ключам второго уровня.
# Если же всегда лишь 1 вложенный словарь, то от цикла можно избавиться
for k2 in source[k]:
result[k][k2] = dict()
# Нумеруем содержимое списка и складываем в словарь
for value in source[k][k2]:
result[k][k2][idx] = value
idx += 1
print(result)
Вывод:
{1: {'some_str1': {1: 'a', 2: 'b'}}, 2: {'some_str2': {3: 'c', 4: 'd', 5: 'f'}}}
Автор решения: splash58
→ Ссылка
Можно сделать свой генератор :) Но это тоже не одна строка
tmp = [0]
def ind():
tmp[0] += 1
return tmp[0]
my_dict1 = {key_1: {key_2: {ind(): key_3 for key_3 in my_dict[key_1][key_2]} for key_2 in my_dict[key_1]} for key_1 in my_dict}
print(my_dict1)