Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Duvida Listas

Boa tarde, Meu código executa na primeira vez sem problemas, quando eu continuo e vou inserir a nota1 do segundo aluno ele da esse erro.

"notas[0].append(nota1) IndexError: list index out of range"

Como ele funciona a primeira vez acredito que eu deva estar fazendo algo errado na hora do método clear(), não consegui descobrir exatamente onde esta o erro para ele não funcionar na segunda vez que coloco a nota1.

dados = []
nomes = []
notas = [[],[]]

while True:
    aluno= str(input("Nome: "))
    nomes.append(aluno)
    nota1 = float(input("Nota1: "))
    notas[0].append(nota1)
    nota2 = float(input("Nota2: "))
    notas[1].append(nota2)

    dados.append(nomes[:])
    dados.append(notas[:])

    nomes.clear()
    notas.clear()

    resposta = str(input("Quer continuar? "))
    if resposta in 'Nn':
        break


print(dados)
2 respostas
solução!

Olá Otto, tudo bem? Espero que sim!

Da forma que você está fazendo, quando cria uma lista notas = [ [] , [] ] o Python entende que é uma lista com duas listas vazias. Ainda assim ele entenderá como uma lista.

Quando você faz notas.clear(), você estará limpando a lista notas para um objeto do tipo notas = []. Portanto quando tentar acessar notas[0] ou notas[1], ele não conseguirá acessar mais as listas vazias que você tinha criado anteriormente.

Você pode substituir a parte do notas.clear() por notas = [ [] , [] ], isso fará com que o objeto volte a ser como era inicialmente. Você estará sobrescrevendo o objeto notas.

O código ficará assim:

dados = []
nomes = []
notas = [[],[]]

while True:
    aluno= str(input("Nome: "))
    nomes.append(aluno)
    nota1 = float(input("Nota1: "))
    notas[0].append(nota1)
    nota2 = float(input("Nota2: "))
    notas[1].append(nota2)

    dados.append(nomes[:])
    dados.append(notas[:])

    nomes.clear()
    notas = [[], []]

    resposta = str(input("Quer continuar? "))
    if resposta in 'Nn':
        break


print(dados)

Eu fiz um outro código com algumas mudanças, para que as notas e o nome fiquem agrupados na mesma lista, além disso substituí o while True por uma condição de parada, para evitar problemas. O while True apesar de poder ser utilizado, pode travar por não ter uma condição de parada caso você altere alguma coisa no bloco de código.

dados = []
resposta = 's'

while resposta not in 'Nn':
    aluno= str(input("Nome: "))
    nota1 = float(input("Nota1: "))
    nota2 = float(input("Nota2: "))

    notas = (nota1, nota2)
    dados.append([aluno, notas])

    resposta = str(input("Quer continuar? "))

print(dados)

Espero que tenha tirado sua dúvida.

Estou à disposição. Bons estudos!

Muito obrigado pelas dicas consegui entender!