Лабораторное задание по Тезаурусу

#python

Вопрос:

У меня есть домашнее задание, с которым я никак не могу разобраться. Проблема в том, что:

Учитывая набор текстовых файлов, содержащих синонимы для разных слов, выполните основную программу для вывода синонимов для определенного слова. Каждый текстовый файл содержит синонимы для слова, указанного в имени файла, и в каждой строке файла перечислены синонимы слова, начинающиеся с одной и той же буквы, разделенные пробелом. Программа считывает слово и письмо пользователя и открывает текстовый файл, связанный с введенным словом. Затем программа сохраняет содержимое текстового файла в словарь, предварительно определенный в программе. Наконец, программа выполняет поиск в словаре и выводит все синонимы, начинающиеся с входной буквы, по одному синониму на строку или сообщение, если синонимы, начинающиеся с входной буквы, не найдены.

Подсказки: Используйте первую букву синонима в качестве ключа при сохранении синонима в словаре. Предположим, что все буквы написаны в нижнем регистре.

Пример: Если ввод программы является:

 educate
c the program opens the file educate.txt, which contains:

brainwash brief
civilize coach cultivate
develop discipline drill
edify enlighten exercise explain
foster
improve indoctrinate inform instruct
mature
nurture
rear
school
train tutor then the program outputs:

civilize
coach
cultivate Ex: If the input of the program is:

educate
a then the program outputs:

No synonyms for educate begin with a.
 

В настоящее время у меня есть это, и сейчас сосредоточен только один файл:

 synonyms = {}   # Define dictionary

initial_input = input()
start_letter = input()


if initial_input == 'Educate' or 'educate':
    with open('educate.txt', 'r') as e:
        lines = e.readlines()
        for word in lines:
            if ord(str(word[0])) == ord(str(start_letter)):
                key = start_letter
                split = word.split(' ')
                synonyms[key] = split
                print(synonyms)
            if ord(str(start_letter)) != ord(str(word[0])):
                print(f'No synonyms for educate begin with {start_letter}.')
        
elif initial_input == 'Happy' or 'happy':
    with open('happy.txt', 'r') as h:
        lines = h.readlines()

                
elif initial_input == 'Goal' or 'goal':
    with open('goal.txt', 'r') as e:
        lines = e.readlines()
 

and when inputting:

 educate
b
 

I get:

 {'b': ['brainwash', 'briefn']}
No synonyms for educate begin with b.
No synonyms for educate begin with b.
No synonyms for educate begin with b.
No synonyms for educate begin with b.
No synonyms for educate begin with b.
No synonyms for educate begin with b.
No synonyms for educate begin with b.
No synonyms for educate begin with b.
No synonyms for educate begin with b.
No synonyms for educate begin with b.
 

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

Редактировать: Я немного изменил код и придумал:

 if initial_input.lower() == 'educate':
    with open('educate.txt', 'r') as e:
        lines = e.readlines()
        for word in lines:
            if word[0] == start_letter:
                split = word.split(' ')
                synonyms[start_letter] = split
                for x in synonyms[start_letter]:
                    print(x)
                break
            else:
                print(f'No synonyms for educate begin with {start_letter}.')
 

но обратите внимание, что, поскольку он читает строки сверху вниз, например, при изменении начальной буквы на » c » он выводит:

 No synonyms for educate begin with c.
civilize
coach
cultivate
 

Как бы вы заставили его не смотреть на буквы выше?

Комментарии:

1. В стороне, ord(str(word[0])) == ord(str(start_letter)) может быть просто word[0] == start_letter

2.Обратите внимание if initial_input == 'Educate' or 'educate': , что это всегда верно, это не проверяет, так ли initial_input это "Educate" или "educate" вам нужно использовать if initial_input == 'Educate' or initial_input == 'educate': , хотя вы можете просто сделать if initial_input.lower() == "educate" , но вы не должны проверять это таким образом с самого начала. Используйте словарь.

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

Ответ №1:

Ваш

 if ord(str(start_letter)) != ord(str(word[0])):
                print(f'No synonyms for educate begin with {start_letter}.')
 

Выполняется для каждой строки. Поэтому он напечатает инструкцию no synonyms для каждой строки в educate.txt это не начинается с вашей целевой буквы.

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

 for word in lines:
  if word[0] == start_letter:
    split = word.split(' ')
    synonyms[start_letter] = split
    print(synonyms)
    break
else:
  print(f'No synonyms for educate begin with {start_letter}.')
 

Кроме того, ваши операторы if не работают, так как предложение or ‘educate’ всегда истинно. Вам следует либо сделать

 if initial_input == 'Educate' or initial_input == 'educate'
 

Или, скорее всего, лучше,

 if initial_input.lower() == 'educate'