Error List index out of range

Asked

Viewed 5,613 times

3

I’m developing a quiz with Python And I have a problem that I think is simple but I’m having trouble solving. When the person completes the quiz the message that was to appear does not appear and gives an error:

Traceback (most recent call last):
    File "python", line 83, in <module>
    File "python", line 26, in verificacao
IndexError: list index out of range

Follows the code:

# coding=utf-8

print ("Escolha a dificuldade para o quiz. Escolha F para fácil, M para médio, ou D para difícil.")


# Lista de tentativas já realizadas
count_list = []

perguntas = [
    "Digite a palavra que substituirá o espaço 0: ",
    "Digite a palavra que substituirá o espaço 1: ",
    "Digite a palavra que substituirá o espaço 2: ",
    "Digite a palavra que substituirá o espaço 3: "
]


def verificacao(frase, respostas, tentativas):
    # Verifica e conta as palavras de todo o quiz
    print
    print (frase)
    print

    index = 0

    while len(count_list) < tentativas and index < (tentativas + 1):
        pergunta = input(perguntas[index]).lower()

        if index == tentativas and pergunta == respostas[index]:
          print ("Você ganhou o quiz! Parabéns!")
          break

        if pergunta == respostas[index]:
            print ("Você acertou!")
            frase = frase.replace(str(index), respostas[index])
            print (frase)
            index += 1
            print

        else:
            count_list.append(1)
            print ("Opa, você errou. Você tem mais " + str(
                tentativas - len(count_list)) + " tentativa(s).")

            if len(count_list) == tentativas:
                print ("Você perdeu. Continue tentando.")
                break


# Variaveis do quiz: frases e respostas
frase_facil = "Água __0__, pedra __1__, tanto __2__ até que __3__."
frase_medio = "De __0__, poeta e __1__, todo __2__ tem um __3__."
frase_dificil = "Um __0__, de exemplos __1__ mais que uma __2__ de __3__."

frase = [frase_facil, frase_medio, frase_dificil]

respostas_facil = ['mole', 'dura', 'bate', 'fura']
respostas_medio = ['medico', 'louco', 'mundo', 'pouco']
respostas_dificil = ['grama', 'vale', 'tonelada', 'conselhos']

respostas = [respostas_facil, respostas_medio, respostas_dificil]


def attempts():
    # Verifica se a quantidade de tentativas que o usuario escolheu esta correta, se for ele retorna, caso contrario aparece uma mensagem para tentar novamente.
    while True:
        try:
            tentativas = int(
                input("Quantas tentativas que você quer? "))
            return tentativas
            break
        except ValueError:
            print("Você precisa colocar um algarismo. Tente outra vez.")
            continue


while True:
    # Input do usuário a partir do nível de dificuldade e número de tentativas escolhidos, para iniciar o quiz correto. Retorna se for valido, caso contrario aparece mensagem pedindo para tentar novamente.
    nivel_dificuldade = input("Nível de dificuldade: ")
    tentativas = attempts()

    if nivel_dificuldade.lower() == "f" or nivel_dificuldade.lower(
    ) == "facil" or nivel_dificuldade.lower() == "fácil":
        verificacao(frase_facil, respostas_facil, tentativas)
        break
    elif nivel_dificuldade.lower() == "m" or nivel_dificuldade.lower(
    ) == "medio" or nivel_dificuldade.lower() == "médio":
        verificacao(frase_medio, respostas_medio, tentativas)
        break
    elif nivel_dificuldade.lower() == "d" or nivel_dificuldade.lower(
    ) == "dificil" or nivel_dificuldade.lower() == "difícil":
        verificacao(frase_dificil, respostas_dificil, tentativas)
        break
    print ("Escolha a dificuldade do seu quiz, você precisa apertar a letra F, M ou D. Tente novamente.")
  • Apparently you try to get the question before checking if the quiz is over. In this case, it will always look for a question that does not exist.

  • Apart from that, the logic seems very confusing. Could you ask the question your complete code? For if I put 5 attempts and there are only 3 questions, I will have to purposely miss 2 times to finish the game, since there is the condition index == tentativas?

  • I put Anderson

1 answer

1

this error only happens when you try to call an index value that has no value or has not been initialized ( example, call an index = 4 in a list with 3 items). most likely the error happens because you increase the index indefinitely while in the game... which causes it to go outside the scope of the list. I would recommend separating the incrementing index from the index the list reads. Otherwise your code from strange errors of variable blurring when I tested here, so I don’t know if there are other errors

  • Running it in the repl.it the only mistake is this, I’m not able to solve even.

  • The error I saw is as I said... you are comparing the same variable that increases, so if you miss say 2 times and hit the rest the variable will have increased more indices that exist in the list. Soon you’ll be out of range

  • And how can I solve this friend? I started learning agr programming and I’m a little lost

  • in case your code would have to restructure several things, I suggest using a variable for index that iterates through the list and another variable to check the trials separately and yet another variable to check the amount of right answers and see if the user really got it right... In this case you have 3 variables, one that iterates through the list, the other that checks the answers and the other that checks the attempts. if you cross it will fill with bugs in case users do unexpected things

  • so you are always sure of the numbers assigned to all variables at all times... in your code you modify the variable index a lot, which is amesma to check attempts , iterate through the list and check responses

Browser other questions tagged

You are not signed in. Login or sign up in order to post.