Вы можете использовать setdefault до инвертировать словарь:
my_dict = {1: [3], 2: [4, 5, 6], 3: [1, 2], 4: [5, 6], 5: [4, 6], 6: [4, 5]}
new_dict = {}
for key, values in my_dict.items():
for value in values:
new_dict.setdefault(value, []).append(key)
print(new_dict)
Выход
{1: [3], 2: [3], 3: [1], 4: [2, 5, 6], 5: [2, 4, 6], 6: [2, 4, 5]}
идея состоит в том, чтобы перебрать каждую пару (ключ, значения), а затем использовать каждое значение в качестве ключа, setdefault
будет обрабатывать случай, когда ключ отсутствует.Альтернативой может быть установка пустого списка в качестве значения по умолчанию для каждого нового ключа в new_dict
, например:
# set the empty list for each new key in new_dict
new_dict = {}
for values in my_dict.values():
for value in values:
new_dict[value] = []
# fill new_dict
for key, values in my_dict.items():
for value in values:
new_dict[value].append(key)
Это приведет к тому же выводу, что и выше, третий вариант будет использовать collection.defaultdict и пропустите первый цикл:
from collections import defaultdict
my_dict = {1: [3], 2: [4, 5, 6], 3: [1, 2], 4: [5, 6], 5: [4, 6], 6: [4, 5]}
new_dict = defaultdict(list)
for key, values in my_dict.items():
for value in values:
new_dict[value].append(key)
print(new_dict)
Output
defaultdict(<class 'list'>, {1: [3], 2: [3], 3: [1], 4: [2, 5, 6], 5: [2, 4, 6], 6: [2, 4, 5]})
Обратите внимание, что это возвращает defaultdict, то есть sub-класс dict.