Учитывая длинную строку, найдите соответствующие строки в словаре - PullRequest
1 голос
/ 23 октября 2019

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

Пользователь может ввести строку с названием еды (например, "сырный пирог с банановым йогуртом и стейком"), и для простоты предположим, что все написано строчными буквами, и имя еды не появляется более одного раза встрока.

Какой самый эффективный способ выяснить, какие ключи из словаря появились в строке названия еды? Давайте предположим, что возможно, что никакой ключ не появляется вообще, и также возможно, что строка названия еды состоит только из ключей словаря.

Это для самообучения. Использование Suffix Trie кажется хорошим вариантом, но я не уверен, как его оптимизировать (поскольку в этом случае возможно несколько совпадений). Если для него есть хорошо известные теоремы или ссылки,Я был бы очень признателен.

PS. Спасибо за ответ, но единственная проблема в том, что название еды не обязательно должно быть длинным . Давайте подумаем о чем-то вроде этого.

"мягкое кофейное мороженое"

это длинная строка из 4 слов, но только 2 названия продуктов: мягкий кофе, ледкрем

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Это то, что вы имели в виду?

dict = {
  "banana": "answer1",
  "steak": "answer1",
  "cheese": "answer1"
}
input = "banana yogurt steak cheese cake"
for word in input.split():
    print (word)
    if word in dict:
        print ("true")

Вывод:

banana
true
yogurt
steak
true
cheese
true
cake

Если это не одно слово:

dict = {
  "banana milk shake": "answer1",
  "steak": "answer2",
  "ice cream": "answer3",
  "salad dressing": "answer4"
}
input = "banana milk shake yogurt steak cheese ice cream cake"
for key in dict:
    print (key)
    if key in input:
        print ("true")
    else:
        print ("false")

Вывод:

banana milk shake
true
steak
true
ice cream
true
salad dressing
false
1 голос
/ 23 октября 2019

Для этой цели вы можете использовать установить пересечение :

set(food_string.split()) & food_dict.keys()

Обратите внимание, что dict.keys(), хотя и не set, поддерживает set API.

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

[k for k in food_dict if k in food_string]
...