Python: IndexError: список индексов вне диапазона - PullRequest
9 голосов
/ 13 февраля 2012

Я думаю, что моя программа завершена, но ... она не работает.Я пытаюсь написать программу, которая имитирует лотерею, но когда я пытаюсь проверить догадки пользователя по количеству догадок в билете, я получаю сообщение об ошибке «Индекс списка вне диапазона».Я думаю, что это как-то связано с той частью кода, где я назначаю случайные цифры "a", "b", "c" и т. Д. Но я не уверен.

Вот код целиком:

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()

И вот ошибка, которую я получаю:

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

Ответы [ 3 ]

10 голосов
/ 13 февраля 2012

Как отмечается в сообщении об ошибке, проблема заключается в следующей строке:

if guess[i] == winning_numbers[i]

Ошибка заключается в том, что индексы вашего списка выходят за пределы диапазона, то есть вы пытаетесь сослаться на какой-то индекс, который недаже не существует.Не отлаживая ваш код полностью, я бы проверил строку, в которой вы добавляете догадки на основе ввода:

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)

Размер количества угаданий, которые вы даете своему пользователю, основан на

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

Так что, если количество желаемых билетов меньше 5, то ваш код здесь

for i in range(5):

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

return match

выдаст ошибку, потому что в списке guess просто не так много элементов.

2 голосов
/ 13 февраля 2012

Вот ваш код. Я предполагаю, что вы используете Python 3 на основе использования print() и 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()
1 голос
/ 13 февраля 2012

Я думаю, что вы хотите поместить случайное число a, b, c и т.д. в цикл:

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)

В противном случае a будет сгенерировано просто1007 * один раз , и если он уже находится в winning_numbers, он не будет добавлен.Так как генерация a является вне while (в вашем коде), если a уже находится в winning_numbers, то слишком плохо, он не будет повторно свернут, и выу вас будет на один выигрышный номер меньше.

Это может быть причиной вашей ошибки в if guess[i] == winning_numbers[i].(Ваш winning_numbers не всегда имеет длину 5).

...