Python: IndexError: índice de lista fuera de rango

Creo que tengo mi progtwig completado, pero … no funciona. Estoy tratando de escribir un progtwig que simule un juego de lotería, pero cuando trato de comparar las conjeturas del usuario con el número de conjeturas en el boleto, aparece un error que me dice que “el índice de la lista está fuera de rango”. Creo que tiene algo que ver con la parte del código donde asigno los dígitos aleatorios a “a”, “b”, “c”, etc. Pero no estoy seguro.

Aquí está el código en su totalidad:

import random def main(): random.seed() #Prompts the user to enter the number of tickets they wish to play. tickets = int(input("How many lottery tickets do you want?\n")) #Creates the dictionaries "winning_numbers" and "guess." Also creates the variable "winnings" for total amount of money won. winning_numbers = [] guess = [] winnings = 0 #Generates the winning lotto numbers. for i in range(tickets): del winning_numbers[:] a = random.randint(1,30) while not (a in winning_numbers): winning_numbers.append(a) b = random.randint(1,30) while not (b in winning_numbers): winning_numbers.append(b) c = random.randint(1,30) while not (c in winning_numbers): winning_numbers.append(c) d = random.randint(1,30) while not (d in winning_numbers): winning_numbers.append(d) e = random.randint(1,30) while not (e in winning_numbers): winning_numbers.append(e) print(winning_numbers) getguess(guess, tickets) nummatches = checkmatch(winning_numbers, guess) print("Ticket #"+str(i+1)+": The winning combination was",winning_numbers,".You matched",nummatches,"number(s).\n") if nummatches == 0 or nummatches == 1: winnings = winnings + 0 elif nummatches == 2: winnings = winnings + 10 elif nummatches == 3: winnings = winnings + 500 elif nummatches == 4: winnings = winnings + 20000 elif nummatches == 5: winnings = winnings + 1000000 print("You won a total of",winnings,"with",tickets,"tickets.\n") #Gets the guess from the user. def getguess(guess, tickets): del guess[:] for i in range(tickets): bubble = input("What numbers do you want to choose for ticket #"+str(i+1)+"?\n").split(" ") guess.append(bubble) print(bubble) #Checks the user's guesses with the winning numbers. def checkmatch(winning_numbers, guess): match = 0 for i in range(5): if guess[i] == winning_numbers[i]: match = match+1 return match main() 

Y aquí está el error que recibo:

 Traceback (most recent call last): File "C:\Users\Ryan\Downloads\Program # 2\Program # 2\lottery.py", line 85, in  main() File "C:\Users\Ryan\Downloads\Program # 2\Program # 2\lottery.py", line 45, in main nummatches = checkmatch(winning_numbers, guess) File "C:\Users\Ryan\Downloads\Program # 2\Program # 2\lottery.py", line 79, in checkmatch if guess[i] == winning_numbers[i]: IndexError: list index out of range 

Como señala el error, el problema está en la línea:

 if guess[i] == winning_numbers[i] 

El error es que los índices de su lista están fuera de rango, es decir, está intentando referirse a un índice que ni siquiera existe. Sin depurar completamente su código, verificaría la línea en la que está agregando conjeturas basadas en la entrada:

 for i in range(tickets): bubble = input("What numbers do you want to choose for ticket #"+str(i+1)+"?\n").split(" ") guess.append(bubble) print(bubble) 

El tamaño de cuántas conjeturas le está dando a su usuario se basa en

 # Prompts the user to enter the number of tickets they wish to play. tickets = int(input("How many lottery tickets do you want?\n")) 

Entonces, si el número de boletos que quieren es menor a 5, entonces su código aquí

 for i in range(5): if guess[i] == winning_numbers[i]: match = match+1 return match 

lanzará un error porque simplemente no hay tantos elementos en la lista de guess .

Aquí está tu código. Supongo que estás usando python 3 basado en el uso que haces de print() y input() :

 import random def main(): #random.seed() --> don't need random.seed() #Prompts the user to enter the number of tickets they wish to play. #python 3 version: tickets = int(input("How many lottery tickets do you want?\n")) #Creates the dictionaries "winning_numbers" and "guess." Also creates the variable "winnings" for total amount of money won. winning_numbers = [] winnings = 0 #Generates the winning lotto numbers. for i in range(tickets * 5): #del winning_numbers[:] what is this line for? randNum = random.randint(1,30) while randNum in winning_numbers: randNum = random.randint(1,30) winning_numbers.append(randNum) print(winning_numbers) guess = getguess(tickets) nummatches = checkmatch(winning_numbers, guess) print("Ticket #"+str(i+1)+": The winning combination was",winning_numbers,".You matched",nummatches,"number(s).\n") winningRanks = [0, 0, 10, 500, 20000, 1000000] winnings = sum(winningRanks[:nummatches + 1]) print("You won a total of",winnings,"with",tickets,"tickets.\n") #Gets the guess from the user. def getguess(tickets): guess = [] for i in range(tickets): bubble = [int(i) for i in input("What numbers do you want to choose for ticket #"+str(i+1)+"?\n").split()] guess.extend(bubble) print(bubble) return guess #Checks the user's guesses with the winning numbers. def checkmatch(winning_numbers, guess): match = 0 for i in range(5): if guess[i] == winning_numbers[i]: match += 1 return match main() 

Creo que te refieres a poner el balanceo de la aleatoria a, b, c, etc. dentro del bucle:

 a = None # initialise while not (a in winning_numbers): # keep rolling an a until you get one not in winning_numbers a = random.randint(1,30) winning_numbers.append(a) 

De lo contrario, se generará un solo una vez , y si ya está en número de winning_numbers , no se agregará. Dado que la generación de a está fuera de while (en su código), si a ya está en winning_numbers entonces es una lástima, no se volverá a tirar, y tendrá un número ganador menos.

Eso podría ser lo que causa su error if guess[i] == winning_numbers[i] . (Sus winning_numbers no siempre son de longitud 5).