с решением задачи (язык Python): Задача 6. Словарь синонимов
Одна библиотека поручила вам написать программу для оцифровки словарей слов-синонимов. На вход в программу подаётся N пар слов. Каждое слово является синонимом к парному ему слову.
Реализуйте код, который составляет словарь слов-синонимов (все слова в словаре различны), затем запрашивает у пользователя слово и выводит на экран его синоним. Обеспечьте контроль ввода: если такого слова нет, то выведите ошибку и запросите слово ещё раз. При этом проверка не должна зависеть от регистра символов.
Пример:
Введите количество пар слов: 3
1 пара: Привет - Здравствуйте
2 пара: Печально - Грустно
3 пара: Весело - Радостно
Введите слово: интересно
Такого слова в словаре нет.
Введите слово: здравствуйте
Синоним: Привет
Мой код ниже:
dictionary = dict()
for i in range(int(input('Введите количество пар слов: '))):
words = input('{} пара: '.format(i + 1)).lower().split(' - ')
dictionary[words[0]] = words[1]
for key in dictionary:
while True:
word = input('\nВведите слово: ').lower()
if key == word:
print('Синоним:', dictionary[key])
break
elif dictionary[key] == word:
print('Синоним:', key)
break
else:
print('Такого слова в словаре нет.')
В чём проблема:
1. Если пар синонимов больше, чем одна, надо чтобы программа остановилась сразу после первой проверки. Сейчас код этого не предполагает почему-то (очень хочется получить объяснение)
2. Если будет условно 2 пары синонимов, например такие:
1 пара: Привет - Здравствуйте
2 пара: Печально - Грустно
И сначала ввести слово "интересно", программа напишет, что такого слова нет в словаре. А если затем ввести слово "привет", то программа уже не будет проверять в этой паре, а сразу перейдёт к следующей. Тоже хочется исправить и получить объяснения.
!
Исходный код (Python 3.8 x64):
class InvalidArgumentException(Exception): pass
class KeyValuePair:
def __init__(self, key, value):
self._key = key
self._value = value
@staticmethod
def FromList(pair: list):
if (len(pair) != 2): raise InvalidArgumentException("List must contain strictly 2 elements for initialize KeyValuePair")
return KeyValuePair(pair[0], pair[1])
@property
def Key(self):
return self._key
@property
def Value(self):
return self._value
def strip(string: str):
return string.strip()
def readWordPairs(wordCount: int, pairSeparator: str = "-") -> dict:
temp = dict()
for i in range(wordCount):
wordPair = KeyValuePair.FromList(list(map(strip, input(f'{i} pair: ').lower().split(pairSeparator
if wordPair.Key in temp.keys():
temp[wordPair.Key] = [temp[wordPair.Key], wordPair.Value]
else:
temp[wordPair.Key] = wordPair.Value
return temp
def main():
wordCount = int(input("Enter words pairs count:\n"))
wDict = readWordPairs(wordCount)
while True:
word = input("Enter word: ")
if word.lower() == "exit": break
print(f"Synonim: {wDict[word]}" if word in wDict.keys() else "Not found")
input("press any key to close program")
if __name__ == "__main__":
main()
Объяснение:
Если есть вопросы - не стесняйтесь задать в комментариях к ответу. Ошибок, которые вы описали в задании, в данном случае не наблюдается. Единственное, я сделал так, что бы программа не завершалась после первого найденного слова, а запрашивала слова до тех пор, пока пользователь не введёт команду exit
1. Создадим пустой словарь для хранения пар синонимов:
```python
dictionary = {}
```
2. Запросим у пользователя количество пар слов и проверим, что оно больше 0:
```python
num_pairs = int(input('Введите количество пар слов: '))
while num_pairs <= 0:
print('Количество должно быть больше 0')
num_pairs = int(input('Введите количество пар слов: '))
```
3. В цикле запросим у пользователя каждую пару слов и запишем их в словарь, приведя все слова к нижнему регистру:
```python
for i in range(num_pairs):
words = input('{} пара: '.format(i + 1)).lower().split(' - ')
dictionary[words[0]] = words[1]
```
4. Запросим у пользователя слово и проверим его синонимы в словаре:
```python
while True:
word = input('\nВведите слово: ').lower()
if word in dictionary:
print('Синоним:', dictionary[word])
break
elif word in dictionary.values():
for key, value in dictionary.items():
if value == word:
print('Синоним:', key)
break
break
else:
print('Такого слова в словаре нет.')
```
Теперь касательно пояснений:
1. Программа должна остановиться после первой проверки, если слово найдено в словаре. Это достигается с помощью оператора `break`, который прерывает выполнение текущего цикла и переходит к следующей инструкции в программе.
2. Для проверки синонимов, в случае если слово не найдено как ключ в словаре, мы проверяем значения словаря с помощью метода `values()`. Для каждого значения, мы итерируем по всем парам ключ-значение с помощью метода `items()` и сравниваем значение с введенным словом.
Теперь код будет работать как требуется, проверяя все пары синонимов и завершая работу, если слово найдено.