У меня есть список слов, которые я хочу сохранить в быстро извлекаемой структуре данных, поэтому, когда слово запрашивается, я могу вернуть все его анаграммы.Я подумал о словаре с {(len, sum) : word}
, но мне трудно реализовать:
data = "mom, dad, house, home, cat, horse, an, ordinary, act" # note "cat" and "act" are anagrams
data = data.replace(" ", "") # remove whitespaces
d = {word : (len(word), sum(map(ord, word))) for word in data.split(",")}
print(sorted(d.items(), key=lambda k:k[1]))
#prints: [('an', (2, 207)), ('dad', (3, 297)), ('act', (3, 312)), ('cat', (3, 312)), ('mom', (3, 329)), ('home', (4, 425)), ('horse', (5, 545)), ('house', (5, 548)), ('ordinary', (8, 872))]
# [OK]
inv_d = {v: k for k, v in d.items()}
print(sorted(inv_d.items(), key=lambda k:k[1]))
[((2, 207), 'an'), ((3, 312), 'cat'), ((3, 297), 'dad'), ((4, 425), 'home'), ((5, 545), 'horse'), ((5, 548), 'house'), ((3, 329), 'mom'), ((8, 872), 'ordinary')]
# [Не в порядке - (3,312) также следует сопоставить с «действием», но это значение было отброшено]
Как я могу инвертировать dict, чтобы каждое значение в исходном dict теперь было ключом, но все соответствующие ключи из исходного dict будут объединены в список значений в новом dict?
Ожидаемый результат:
[((2, 207), 'an'), ((3, 312), ['cat', 'act']), ...]