#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
флаг.