#python
Вопрос:
Я создаю редактор викторин на Python. Внутри раздела кода, где пользователь может удалить вопросы из своего теста, мне дается:
Ошибка значения: список.удалить(x): x нет в списке
Вот мой код, в котором указана ошибка:
# Allows the user to remove a question from the quiz
doubleCheck = ""
amountOfQuestions = 0
if choice == "3": # this is where the section of code starts where the user can remove questions
amountOfQuestions = []
print("nQuestion List")
counter = 1
for count in range(0, len(quiz)): # gets all the questions and prints them
parts = quiz[count].split(",")
amountOfQuestions = amountOfQuestions 1 # meanwhile this tracks how many questions there are
print("Question ", counter, " :", parts[0])
counter = counter 1
choice = input(
str("nChoose question number to remove (type Quit to cancel): ")) # user chooses the question they want to remove
if int(choice) <= amountOfQuestions and int(choice) > 0:
print("Question selected")
doubleCheck = input(
str("Are you sure you want to remove the quesiton? (y/n): ")) # double checks the user wants to remove the question
if doubleCheck == "y":
quiz.remove(choice) # when I choose "y", the error in the question on StackOverflow shows up here
print("Question removed")
quizEditor(quiz) # goes back to the main menu
else:
print("Operation Cancelled")
quizEditor(quiz)
elif choice == "Quit":
print("Operation cancelled - check")
quizEditor(quiz)
else:
print("invalid input")
Формат списка «Викторина», в котором хранятся все вопросы, выглядит следующим образом:
[«Вопрос, правильный ответ, неправильный ответ1, Неправильный ответ2, Неправильный ответ3»,]
Один вопрос и его ответы, а также неправильные ответы хранятся внутри 1 элемента списка и разделяются, когда это необходимо, путем ссылки на его индекс и использования .split()
функции.
Комментарии:
1. Вы добавляете значения счетчика туда
amountOfQuestions
, где вы также проверяете, присутствует ли выбор. Тогда вы снимаете с себя выборquiz
. Не могли бы вы объяснить здесь логику? Зачем вы добавляете значения счетчика?2. @vnk Я добавляю значения счетчика в вопросы Amountof в качестве формы проверки ввода, когда пользователь выбирает вопрос. Есть ли лучший способ сделать это?
3. Если
choice
это позиция индекса, то вы можете просто проверить, меньше ли ввод, чем общая длина списка. Я не вижу смысла вamountOfQuestions
том, чтобы просто проверять, присутствует ли в списке значение, заданное пользователем.4. Пожалуйста, ознакомьтесь с документами функций, которые вы используете, прежде чем задавать вопросы здесь.
remove
удаляет элемент , который вы ему передаете, а не индекс (особенно индекс в строковом формате).5. @vnk Я вижу, я подумаю о лучшем способе проверки ввода пользователя
Ответ №1:
list.remove()
за исключением значения, которое нужно удалить из списка, choice
это строка с номером , например '3'
, не фактический вопрос.
Если вы хотите удалить из quiz
списка по индексу, вам нужно преобразовать choice
в int
и использовать del
или pop
(«pop» вернет удаленное значение, если вам это нужно)
index = int(choice)
del quiz[index]
# or
quiz.pop(index)
Комментарии:
1. Да, это прекрасно работает! Однако мне нужно будет убрать 1 из индекса, иначе неправильный индекс будет удален или он вернет ошибку «вне диапазона» .
Ответ №2:
Этот remove()
метод используется для удаления соответствующего элемента из списка. Предполагая, что вы указываете значение choice
для индекса, подлежащего удалению, вы можете использовать этот pop()
метод.
quiz.pop(choice)
Ответ №3:
То, что вы делаете в quiz.remove(choice)
строке-это вызываете операцию, которая ожидает точного соответствия строк в вашем случае.
Это означает, что всякий choice
раз, когда в списке нет фактического элемента, это не удается. Вы могли бы поймать ошибку в питонской манере с помощью
try:
quiz.remove(choice)
except ValueError:
# do whatever
или обязательно проверьте, присутствует ли var в списке, добавив его в предложение if:
if choice in quiz:
#...
Комментарии:
1. также quiz.pop(выбор, нет) будет улавливать несуществующие значения
Ответ №4:
Как сказал Парень в теме ответов, я должен использовать del quiz[индекс], где индекс вводится пользователем, чтобы удалить вопрос.
Однако вы должны убрать 1 из «индекса», иначе неправильный вопрос будет удален или он вернет «ошибку вне диапазона».