Если кто-то вводит a
, вы звоните getMeaning
, что, в свою очередь, вызывает get_close_matches
. Затем вы проверяете, имеет ли этот вызов ненулевое возвращаемое значение, и если это так, вы делаете return DataBase[close_match]
. На этом getMeaning
заканчивается.
Вы никогда не достигнете else
-части getMeaning
, если get_close_matches
даст результаты. На скриншоте вашего вопроса мы видим результаты пользовательского ввода a
, которые имеют смысл, как это, так как get_close_matches
находит cat
аналогично a
.
Независимо от этого, вы должны использовать startswith
, если вы хотите проверить, начинается ли строка с другой строки. Кроме того, вам не нужно elif
или else
после того, как предыдущий if
или elif
имеет return
, и я изменил имена в соответствии с PEP 8 разделом Описательные стили именования .
Вот возможное решение, использующее фильтр, который принимает близкое совпадение, только если буквы такие же, как в word
:
from difflib import get_close_matches
database = {"apple": ["Apple", "apple", "Sib", "Apfel", "Des pommes"], "average": ["Average", "average", "Miangin", "Durchschnitt", "Des pommes"], "acknowledge": ["Acknowledge", "acknowledge", "Tasdigh Kardan", "Zu bestatigen", "Pour reconnaître"], "book": ["Book", "book", "Ketab", "Buch", "Livre"], "banana": ["Banana", "banana", "Mouz", "Bananen", "Bananes"], "beach grass": ["Beach Grass", "beach grass", "Chamane Sahel", "Strandhafer", "herbe de plage"], "cat": ["Cat", "cat", "Gorbe", "Katzen", "chatte"], "certificate": ["Certificate", "certificate", "Govahi Name", "Zertifikat", "certificat"], "declaration of conformity": ["Declaration Of Conformity", "declaration of conformity", "Elamie Entebagh", "Konformitatserklarung", "déclaration de conformité"], "database": ["Database", "database", "Paygah Dade", "Datenbank", "base de données"], "dear colleagues": ["Dear Colleagues", "dear colleagues", "Hamkarane Aziz", "Liebe Mitarbeiterinnen und Mitarbeiter", "Chers collègues"]}
def get_meaning(word):
# Make word case-insensitive
word = word.lower()
# Check if word already in database
if word in database:
return {word: database[word]}
# Find possible close matches
close_matches = get_close_matches(word, database.keys(), 1, 0.3)
# Filter matches: keep only those which contain the same letters
close_matches = [
close_match
for close_match in close_matches
if set(close_match) == set(word)
]
# Return close matches if any left
if close_matches:
return {
close_match: database[close_match]
for close_match in close_matches
}
# Return all dictionary entries which start with the word
return {
entry: database[entry]
for entry in database
if entry.startswith(word)
}
Теперь a
не производит cat
больше:
>>> get_meaning("a")
{'apple': ['Apple', 'apple', 'Sib', 'Apfel', 'Des pommes'], 'average': ['Average', 'average', 'Miangin', 'Durchschnitt', 'Des pommes'], 'acknowledge': ['Acknowledge', 'acknowledge', 'Tasdigh Kardan', 'Zu bestatigen', 'Pour reconnaître']}
Но applle
все равно распознается как apple
:
>>> get_meaning("applle")
{'apple': ['Apple', 'apple', 'Sib', 'Apfel', 'Des pommes']}
В качестве альтернативы, вы можете изменить аргумент cutoff
вашего вызова на get_close_matches
для разных результатов.