Как инвертировать словарь с несколькими одинаковыми значениями? - PullRequest
0 голосов
/ 03 октября 2018

У меня есть список слов, которые я хочу сохранить в быстро извлекаемой структуре данных, поэтому, когда слово запрашивается, я могу вернуть все его анаграммы.Я подумал о словаре с {(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']), ...]

1 Ответ

0 голосов
/ 03 октября 2018

Вы теряете значения, потому что значения исходного dict (который может иметь дубликаты) становятся ключами в этом.Вы могли бы сделать что-то вроде

inverted = defaultdict(list)

for key, value in original_dict.items():
    inverted[value].append(key)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...