Как найти ключ в словаре по значению, который заранее не известен

Мне нужно вывести ключ словаря, совпадающий по значению с элементами списка alph (output: cbb), но не получается.

alph_dict = {'a': '%', 'b': '&', 'c': '*'}
alph = ["*", "&", "&"]

for i in alph:
    if i in alph_dict.values():
        print(alph_dict.get(i))

Он почему-то выдает:

None
None
None

Если пишу так, то он выдает мне просто cb, вместо cbb:

for k, i in alph_dict.items():
    if i in alph:
        print(k, end="")

Как быть? Неужели нужно менять ключи и значения местами или заводить другой словарь или список со значениями? Простого и прямого способа для этого нет?


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

Автор решения: insolor

Он почему-то выдает:

None
None
None

Потому что метод get возвращает из словаря значение по ключу, но не наоборот. Если попытаться передать туда что-то, чего нет среди ключей, то метод вернет None. Вы туда передаете "*", "&", "&", а ключи - 'a', 'b', 'c', соответственно получаете три раза None.

Проще всего такие задачи решаются через инвертированный словарь - нужно создать новый словарь, где ключ и значения стоят наоборот:

alph_dict = {'a': '%', 'b': '&', 'c': '*'}
alph = ["*", "&", "&"]

alph_dict_inverted = {value: key for key, value in alph_dict.items()}

for i in alph:
    print(alph_dict_inverted[i])
c
b
b

Можно использовать модуль bidict, который реализует двусторонний словарь (откуда можно брать как значения по ключам, так и ключи по значниям):

from bidict import bidict

alph_dict = bidict({'a': '%', 'b': '&', 'c': '*'})
alph = ["*", "&", "&"]

for i in alph:
    print(alph_dict.inverse[i])
→ Ссылка