2012-02-13 19 views
6

Creo que tengo mi programa completo, pero ... no funciona. Intento escribir un programa que simule un juego de lotería, pero cuando trato de verificar las conjeturas del usuario con respecto al número de conjeturas en el ticket, 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 asignó los dígitos aleatorios a "a", "b", "c", etc. Pero no estoy seguro.Python: IndexError: lista de índice fuera de rango

Este es 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 consigo:

Traceback (most recent call last): 
    File "C:\Users\Ryan\Downloads\Program # 2\Program # 2\lottery.py", line 85, in <module> 
    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 
+0

leer el rastreo, en la mayoría de los casos puede ser útil. – monkut

+0

¿cuánto duran los números ganadores? Creo que encontrarás que es <= 5. Su generador de números ganador es defectuoso. Debe colocar 'a = randint (1,30)' _inside_ en el ciclo while. De lo contrario, solo lo ejecuta una vez. –

+1

también, no hay absolutamente ninguna razón para usar la línea 'del myList [:]' En la función 'getguess',' guess' se define dentro del alcance de la función. inicialice la suposición con 'guess = []'. –

Respuesta

7

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 consultar algún índice que ni siquiera existe. Sin depurar su código totalmente, me gustaría comprobar la línea en la que está añadiendo conjeturas sobre la base de 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 la cantidad de conjeturas que 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")) 

Así que si el número de entradas que buscan es inferior a 5, entonces su código aquí

for i in range(5): 

if guess[i] == winning_numbers[i]: 
    match = match+1 

return match 

generará un error porque simplemente no hay muchos elementos en la lista guess.

+0

Muchas gracias.Ahora que lo señalas, el error es casi vergonzosamente obvio. –

+2

En realidad, sus errores se están causando un poco antes en la línea. Basado en su declaración de entrada, 'burbuja' es una lista de cadenas. Esta lista luego se adjunta a 'adivinar'. Así que 'adivinar' sería algo así como: '[['12', '30', '12', '23'. '3'], ['4', '5', '7', '8', '16']] '. El método de lista adecuado es 'guess.extend()'. Además, los valores son cadenas, por lo que incluso cuando se comparan, la comparación _ nunca_ devolverá verdadera. –

0

Creo que te refieres a poner el balanceo de la una al azar, b, c, etc. dentro el 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, a se generarán simplemente vez, y si es en winning_numbers ya, no será agregado. Dado que la generación de a es fuera dewhile (en su código), si a ya está en winning_numbers, está muy mal, no se volverá a enrollar, y tendrá un número menos ganador.

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

+0

Este código solo se ejecutará _if_ a NO está en números_ganadores. En otras palabras, si hay una repetición, no se agregará ningún número. Recuerde, mientras comprueba la condición de ejecución antes de ejecutar. –

0

Aquí está su código. Estoy asumiendo que usted está utilizando Python 3 basado en el uso 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() 
Cuestiones relacionadas