Как проверить наличие объекта в кортеже?
Начал разработку собственного чат-бота (ну типо ассистент windows) на Python,да бы попрактиковаться. Сразу столкнулся с такой проблемой: нужно проверить что ввел пользователь, и дать соответствующий ответ. Первое что пришло в голову - создать кортежи с списком команд по типу 'привет' / 'как дела?' и т.д. Не работает. Первый раз находит команду (одну) а на следующие - нет. Подскажите, как можно проверить наличие объекта в одном из объектов кортежа? Не обязательно через кортеж, просто нужен вариант решения данной задачи.
P.S. Начал учить Python относительно недавно, по книге "A Byte Of Python", поэтому разбираюсь только в основах...
Вот код подпрограммы, которая имитирует эту ситуацию:
commands = set(('hello', 'Hello', 'Hi', 'hi'))
inp = input("Enter anything: ")
for item in commands:
if item in inp:
print("Успешно!")
break
else:
print("Ошибка...")
break
Ответы (4 шт):
for item in commands:
if item in inp:
print("Успешно!")
break
else:
print("Ошибка...")
Кусок кода в else запустится только если цикл for закончится сам, без break.
Также можно использовать словари:
commands = {"Здраствуйте": ("привет", "прив", "хай")}
inp = input().lower()
for key, value in commands.items():
if inp in value:
print(key)
break
else:
print("Я незнаю такую команду")
Функция lower ставит все символы в нижний регистр.
Можно обратиться к элементу словаря(если они случайные, добавить в начале обязательный, типа "1":1) через блок try, если except сработает - элемента нет. Помещаешь в try действия для присутствующего элемента (советую задать пременную, а потом проверить ее значение, чтобы избежать огромного отступа из-за try'ев), а в except - для отсутсвующего. Вроде должно помочь.
Ваша ошибка в добавлении break. Если на первой итерации item in inp возвращает False, то вы прерываете цикл и больше не смотрите на другие команды. Можно исправить ваш код, убрав блок else.
Небольшая иллюстрация:
commands = ('hello', 'Hello', 'Hi', 'hi')
inp = input("Сообщение: ")
print("\nВаш вариант.")
print(f"Давайте пройдемся по набору commands: {commands}.")
for item in commands:
print(f" * item: {item} {'в' if item in inp else 'не в'} списке комманд.")
if item in inp:
print(" ~ Регестрирую успешность и прерываю цикл.")
break
else:
print(" ~ Регестрирую неудачу и прерываю цикл.")
# Что значит «прерываю цикл» тут?
# То, что этот item не найден в введенном сообщении.
# В этом случае нам нужно ПРОДОЛЖИТЬ (continue) цикл.
break
# continue будет правильным вариантом.
# Иначе введенное сообщение сравнивается ТОЛЬКО
# с первой коммандой набора commands.
# @-@-@-@-@
print("\nМой вариант.")
'''
Каждый элемент X в commands становится str.lower(X).
set'ом удаляем дубликаты.
Получаем набор {"hello", "hi"}.
'''
commands = set(map(str.lower, commands))
print(f"Давайте пройдемся по набору commands: {commands}.")
for command in commands:
print(f" * command: {command} {'в' if command in inp.lower() else 'не в'} списке комманд.")
if command in inp.lower():
print(" ~ Регестрирую успешность и прерываю цикл.")
break
print(" ~ Регестрирую неудачу и продолжаю сравнивать сообщение с другими коммандами.")
print("\nМой вариант 2.")
print("Определим, есть ли введенное сообщение в списке комманд: ", end='')
if any(map(lambda command: command in inp.lower(), commands)):
print("есть!")
else:
print("нету.")
Сообщение: Hi, Racel!
Ваш вариант.
Давайте пройдемся по набору commands: ('hello', 'Hello', 'Hi', 'hi').
* item: hello не в списке комманд.
~ Регестрирую неудачу и прерываю цикл.
Мой вариант.
Давайте пройдемся по набору commands: {'hello', 'hi'}.
* command: hello не в списке комманд.
~ Регестрирую неудачу и продолжаю сравнивать сообщение с другими коммандами.
* command: hi в списке комманд.
~ Регестрирую успешность и прерываю цикл.
Мой вариант 2.
Определим, есть ли введенное сообщение в списке комманд: есть!
cmds = ['hi', 'hello']
inp = input('').lower()
if inp in cmds:
print('Hi')
else:
print('Err')