#python #loops #dictionary #while-loop
Вопрос:
Я пытаюсь создать цикл, который сопоставляет введенные пользователем данные с ключом из определенного словаря и возвращает соответствующее значение в качестве вывода. Однако, когда пользователь вводит что-то, чего нет в ключах, программа не выводит ничего и завершает работу. Но я хочу, чтобы программа продолжала позволять пользователю вводить ввод до тех пор, пока не найдет совпадение по одному из ключей, и она должна завершиться только тогда, когда пользователь предоставит ключ ввода, который находится в настоящем словаре. Я новичок в Python, поэтому не знаю, как использовать оператор while для циклического выполнения процесса. Буду признателен за любую помощь.
list_dict = {"James" : "Pen Set", "Tim" : "Geometry Box", "Rocky" : "Sticky Notes" , "Jeff" : "Alarm Clock" , "Sandy" : "Highlighters"}
_name = input("Enter Name: ")
x = list_dict.get(_name)
while x == None:
_name = input("Re-Enter Name: ")
x = list_dict.get(_name)
break
else:
print(_name, "got", x)
break
Комментарии:
1. Снимите
break
.
Ответ №1:
Вы используете break
ключевое слово непосредственно в цикле времени без каких-либо условий. В результате содержимое цикла может выполняться только один раз перед выходом из цикла. Если вы хотите, чтобы цикл продолжался, удалите break
ключевое слово.
Вот пример ответа на ваш вопрос:
list_dict = {"James" : "Pen Set", "Tim" : "Geometry Box", "Rocky" : "Sticky Notes" , "Jeff" : "Alarm Clock" , "Sandy" : "Highlighters"}
# first input
_name = input("Enter Name: ")
# obtain x
x = list_dict.get(_name)
# perform checking on the latest value of x
while x == None:
_name = input("Re-Enter Name: ")
x = list_dict.get(_name)
# if x is a valid value, the while statement above will detect this and terminate the loop
# final output
print(_name, "got", x)
Замечание 1.имейте в виду, что циклы могут быть завершены автоматически, если правильно задать условие цикла. Произвольное использование break
и continue
ключевые слова, как правило, не рекомендуется из-за нарушения нормального хода программы.
Замечание 2: использование else
ключевого слова с while
ключевым словом на том же уровне означает, что else
блок выполняется только в том случае, если цикл while завершает свое выполнение без каких-либо перерывов, т. е. никогда не встречается с break
ключевым словом. Это неприменимо к вашему случаю, так как условие завершения простое, и нет необходимости обнаруживать, прерывается ли цикл while.
Комментарии:
1. В циклах Python может быть
else
предложение .2. Спасибо! Я тоже этого не знал, просто проверил документацию, довольно удобная функция для использования. Однако эта функция слишком развита, чтобы быть применимой в данном случае.
3. Отредактировал свой ответ, чтобы включить исправление @MisterMiyagi
Ответ №2:
Проблема заключается в заявлении о разрыве. Если вы удалите его, программа должна работать нормально 😉
Ответ №3:
Предоставленный код требует только незначительных изменений, чтобы вызвать ожидаемое поведение. В следующем измененном коде оба break
оператора были удалены:
list_dict = {"James" : "Pen Set", "Tim" : "Geometry Box", "Rocky" : "Sticky Notes" , "Jeff" : "Alarm Clock" , "Sandy" : "Highlighters"}
_name = input("Enter Name: ")
x = list_dict.get(_name)
while x == None:
_name = input("Re-Enter Name: ")
x = list_dict.get(_name)
# break
else:
print(_name, "got", x)
# break
Объяснение
- Удалите первый
break
, чтобыwhile
цикл не выходил всегда после первой итерации. Если имя , предоставленное пользователем, не существуетlist_dict
, мы хотимwhile
, чтобы цикл продолжал повторяться. Размещая abreak
, мы заставляемwhile
цикл завершаться после первой итерации. Также важно отметить, что abreak
приводитelse
к пропуску предложения. В исходном коде, если введенное первое имя не существует, но введенное второе имя существует,break
else
предложение пропускается, иprint
оператор не выполняется. - Удалите второй
break
, потому что он применим только при размещении внутри петли.
Дополнительную информацию см. в документации к break
заявлению.
Тестирование измененного кода
Enter Name: TestName1
Re-Enter Name: TestName2
Re-Enter Name: Jeff
Jeff got Alarm Clock
Ответ №4:
Я немного улучшил ваш код и думаю, что это поможет решить вашу проблему.
list_dict = {"James" : "Pen Set", "Tim" : "Geometry Box", "Rocky" :
"Sticky Notes" , "Jeff" : "Alarm Clock" , "Sandy" : "Highlighters"}
_name = input("Enter Name: ")
while _name not in list_dict.keys():
_name = input("Re-Enter Name: ")
print(f'{_name} got {list_dict.get(_name)}')
Комментарии:
1. Вы могли бы улучшить это , переместив чек из
if
в вwhile
, полностью отбросивif
/else
/break
. Обратите внимание, что вы можете напрямую проверить_name not in list_dict
значение и получить к нему доступ, какlist_dict[_name]
если бы вы были уверены, что ключ существует.2. Отредактировал свой ответ, чтобы включить исправление @MisterMiyagi