Повторение по диктонарии для поиска значения из пары ключ, значение

#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 , чтобы цикл продолжал повторяться. Размещая a break , мы заставляем while цикл завершаться после первой итерации. Также важно отметить, что a break приводит 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