Как найти ключ в словаре по значению, который заранее не известен
Мне нужно вывести ключ словаря, совпадающий по значению с элементами списка 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 шт):
Он почему-то выдает:
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])