Индексация списка во вложенных словарях

Решаю некоторую задачу, столкнулся с такой проблемой

Имеется вложенный словарь такого типа:

{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)
→ Ссылка