Как я могу найти ключ в словаре, соответствующее значение которого, то есть список, содержит X?

У меня есть словарь Python, который отображает ряд слов в списки других слов. Например:

d = {"Hello": ["hi", "hello", "hey", "yo"],
     "Goodbye": ["bye", "see ya", "goodbye", "laters"]}

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

Я уверен, что есть какое-то элегантное решение, использующее некоторые функциональные возможности питонов (возможно, itertools), но это просто вне моей досягаемости...

Любые идеи?


person jramm    schedule 21.08.2015    source источник


Ответы (1)


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

{key for key, words in d.iteritems() if search_word in words}

Если вас интересует только первое совпадение (например, потому что вы сохраняете свои слова уникальными), вы можете использовать next() и выражение генератора:

next((key for key, words in d.iteritems() if search_word in words), None)

Вы, вероятно, захотите создать обратный индекс, если вам нужно проверить несколько слов:

reverse_index = {}
for key, words in d.iteritems():
    for word in words:
        reverse_index.setdefault(word, set()).add(key)

после чего вы можете просто использовать:

reverse_index.get(search_word, set())

чтобы получить тот же результат.

Для уникальных слов в ваших списках обратный индекс будет таким:

reverse_index = {word: key for key, words in d.iteritems() for word in words}
reverse_index.get(search_word)
person Martijn Pieters    schedule 21.08.2015
comment
нет возможности совпадения нескольких ключей, поскольку два списка уникальны? т.е. слово может быть только в одном из списков и, таким образом, иметь один соответствующий ключ. Но в остальном ваше решение хорошее! - person jramm; 21.08.2015