Компактное сжатие словаря

Написал функцию, она создает модифицированный словарь:

  d1 = {1 : 2, 3 : 4, 5 : 4, 7 : 2, 9 : 4}
  def swap_dict (d):
      rd = {}
      for k, v in d.items():
          rd[v] = rd.get(v, []) + [k]
      return rd
  print(swap_dict(d1))

Теперь как решить другой вопрос: Надо написать функцию, которая создаёт компактную версию словаря. Одним словом, ключи сгруппированы по исходному значению в кортежах.

Пример: словарь {1: 2, 3: 4, 5: 4, 7: 2, 9: 4}, сжатый в {(3, 9, 5): 4, (1, 7): 2}


Ответы (2 шт):

Автор решения: strawdog
sd = swap_dict(d1)
res = {tuple(v):k for k, v in sd.items()}

res, соответственно:

{(1, 7): 2, (3, 5, 9): 4}
→ Ссылка
Автор решения: Alexander Chernin
# Исходный словарь
d = {1: 2, 3: 4, 5: 4, 7: 2, 9: 4}

# промежуточный
r = {}
for key, value in d.items():
    if value not in r:
        r[value] = tuple()        
    r[value] += (key,)
    
# результат
res = {v: k for k, v in r.items()}

print(res) # {(3, 9, 5): 4, (1, 7): 2}
→ Ссылка