Я хочу иметь оператор ‘else’ в коде, использующий операторы ‘for’ и ‘if’ для итерации по списку, чтобы найти элемент, который является ключом к словарю

#python #python-3.x

#python #python-3.x

Вопрос:

Я использую оператор ‘for’, а затем оператор ‘if’, чтобы найти элемент из списка, который находится в словаре. Я хочу, чтобы «Любопытно, расскажи мне больше» печатался только один раз.

Вот как я ожидаю, что программа будет работать:

 input: i have a cat
output: Cats are the greatest animals in the world

Input:i do not like dogs 
Output: Dogs are boring

input:i love my pet
Output:Curious, tell me more
  

Мой текущий код:

 Dict_1 = {'cat':'Cats are the greatest animals in the world','dog':'Dogs are boring'}
query = 0
while (not query=='quit'):
     query = input().split()
     for i in query:
          if i in Dict_1:
               query = Dict_1[i]
               print(query)
          else:
               print('Curious, tell me more')
  

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

1. Пожалуйста, предоставьте определение Dict_1 .

2. Следите за отступом (кстати)

3. В чем проблема?

4. любопытный tell me more печатает слишком много раз, он печатает ‘else’ для каждого элемента в списке

Ответ №1:

С query = input().split() помощью вы превращаетесь query в список. Например. если пользователь вводит cat dog , запрос будет ['cat','dog'] .

Итак, вместо проверки query=='quit' (которая никогда не будет истинной, потому query что это список, а не строка), вы должны проверить, содержит 'quit' ли запрос with 'quit' in query .

Если вы не хотите печатать 'Curious, tell me more' , когда пользователь завершает работу, используйте бесконечный while цикл и прерывайте цикл при 'quit' чтении.

Вы можете сгенерировать набор, содержащий команды, найденные в запросе, используя set intersection: commands_found = set(Dict_1.keys()) amp; set(query)

Вот рабочая реализация:

 Dict_1 = {'cat':'Cats are the greatest animals in the world','dog':'Dogs are boring'}
query = []
while True:
    query = input().split()
    if 'quit' in query:
        break
    commands_found = set(Dict_1.keys()) amp; set(query)
    if commands_found:
        for i in commands_found: print(Dict_1[i])
    else:
        print('Curious, tell me more')
  

Обратите внимание, что сейчас я инициализируюсь query как список query = [] .
Вывод:

 I like my cat
Cats are the greatest animals in the world
I like my cat and dog
Cats are the greatest animals in the world
Dogs are boring
I like my racoon
Curious, tell me more
I want to quit
  

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

1. вывод не должен быть любопытным, расскажите мне больше, выполнено ли первое условие

2. должен ли пользователь иметь возможность помещать несколько команд в одну строку или нет?

Ответ №2:

Используйте другую переменную для сохранения ответа и выхода из цикла, как только вы найдете ответ:

 Dict_1 = {'cat':'Cats are the greatest animals in the world','dog':'Dogs are boring'}
query = 0
while (not query=='quit'):
     query = input().split()
     ans = None
     for i in query:
          if i in Dict_1:
               ans = Dict_1[i]
               break
     if ans is None:
          print('Curious, tell me more')
     else:
          print(ans)
  

Ответ №3:

Если вы хотите, чтобы он печатался только один раз, вы могли бы попробовать установить для переменной значение true после печати «любопытно, расскажите мне больше». Таким образом, код должен выглядеть так (на основе ответа glhr)

 Dict_1 = {'cat':'Cats are the greatest animals in the world','dog':'Dogs are boring'}
query = []
out = False
while not 'quit' in query:
    query = input().split()
    for i in query:
         if i in Dict_1:
             print(Dict_1[i])
         else:
             if not out:
                 print('Curious, tell me more')
                 out = True
  

Если вы хотите, чтобы это сбрасывалось каждый раз, когда пользователь вводит запрос, затем перейдите out = False в цикл while.

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

1. out Флаг здесь совершенно не нужен. Код по-прежнему печатается 'Curious, tell me more' только один раз, если вы удалите out флаг.