У меня есть список кортежей, содержащий информацию о людях (по одному для каждого кортежа, с такими вещами, как (имя, возраст и т. д.)). Я хочу проверить список, чтобы увидеть, соответствуют ли какие-либо имена введенным пользователем. Моя проблема в том, что если я использую цикл for, я получаю несколько строк, возвращающих false, а не только одну. Я также не могу попросить пользователя повторить попытку, пока не добьется успеха. Мой текущий код:
last_name = input("Please input person's last name")
for person in personList:
if person[0] == last_name.capitalize():
print("success")
else:
print("fail")
Это будет распечатывать «сбой» для каждого игрока, а не только один раз, и не будет предлагать пользователю повторить попытку. Я знаю, что цикл while допускает несколько попыток, но я не вижу, как связать while с for и все равно выводить «сбой» только один раз.
Поскольку я пытаюсь узнать больше о кортежах, пожалуйста, не предлагайте использовать объекты. Я знаю, что в этом было бы намного больше смысла, но это не помогает мне понимать кортежи.






Вы можете упростить проверку того, находится ли вводимое пользователем значение в personList, до одной строки, как это, а затем проверить, совпал ли ввод хотя бы один раз, и если он напечатал «успех» и прервал цикл, иначе напечатайте «сбой» и снова спросите пользователя.
personList = [('Abc', 'Cba'), ('Xyz', 'Zyx')]
while True:
last_name = input("Please input person's last name: ").capitalize()
if any(last_name == i[0] for i in personList):
print("success")
break
else:
print("fail")
Вывод:
Please input person's last name: random
fail
Please input person's last name: xyz
success
Вам нужны две модификации: способ остановить цикл, если вы найдете совпадение, и способ вывести «сбой», только если вы не нашли совпадений во всем списке.
Вы можете получить первую модификацию, добавив break в оператор if, а можете получить вторую, добавив предложение else в цикл for, что означает «запускать этот код, если цикл завершился полностью».
for person in personList:
if person[0] == last_name.capitalize():
print("success")
break
else:
print("fail")
Итак, прежде всего давайте разберемся, что происходит. Для каждого человека в кортеже вы спрашиваете, зовут ли его X.
Соответственно, каждый человек ответит вам: "Нет", пока вы не дойдете до нужного человека, и только этот человек скажет: "Да", и даже дальше, если он не будет последним, это будет продолжаться до самого конца.
В заключение вы просите каждый кортеж сказать, соответствует ли он вводу пользователя или нет.
Но есть и простой способ исправить это. Так что же мы можем сделать вместо этого?
Мы просто соберем каждый ответ, а затем проверим, существует ли наш ввод в коллекции.
Запишем в коде:
total_collection = []
for person in personList:
if person[0] == last_name.capitalize():
total_collection.append("1")
else:
total_collection.append("0")
if "1" in total_collection:
print("Success!")
else:
print("Fail...")
В этом коде строка «1» представляет совпадение, а строка «0» означает отсутствие совпадения. Кроме того, таким образом вы можете сказать, по какому индексу было найдено совпадение.