2012-02-13 38 views
6

Tôi nghĩ rằng tôi đã hoàn tất chương trình của mình, nhưng ... nó không hoạt động. Tôi đang cố gắng viết một chương trình mô phỏng một trò chơi xổ số, nhưng khi tôi cố gắng kiểm tra các dự đoán của người dùng dựa trên số lượng dự đoán trên vé, tôi nhận được một lỗi cho tôi biết "danh sách danh sách nằm ngoài phạm vi". Tôi nghĩ rằng nó có một cái gì đó để làm với một phần của mã, nơi tôi chỉ định các chữ số ngẫu nhiên để "a," "b", "c", vv Nhưng tôi không chắc chắn.Python: IndexError: chỉ mục danh sách nằm ngoài phạm vi

Đây là mã trong đó là toàn bộ:

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

Và đây là lỗi tôi nhận được:

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

đọc traceback, trong hầu hết trường hợp, nó có thể hữu ích. – monkut

+0

win_numbers dài bao nhiêu? Tôi nghĩ bạn sẽ thấy rằng nó là <= 5. Trình tạo số thắng của bạn không hoàn thiện. Bạn cần đặt 'a = randint (1,30)' _inside_ vòng lặp while. Nếu không, nó chỉ chạy nó một lần. –

+1

cũng có, hoàn toàn không có lý do gì để sử dụng dòng 'del myList [:]' Trong hàm 'getguess',' guess' được định nghĩa trong phạm vi hàm. khởi tạo phỏng đoán với 'guess = []'. –

Trả lời

7

Như các ghi chú lỗi, vấn đề là trong dòng:

if guess[i] == winning_numbers[i] 

Lỗi là chỉ mục danh sách của bạn nằm ngoài phạm vi - nghĩa là, bạn đang cố gắng tham khảo một số chỉ mục thậm chí không tồn tại. Nếu không gỡ lỗi mã của bạn đầy đủ, tôi sẽ kiểm tra đường dây, nơi bạn đang thêm dự đoán dựa trên đầu vào:

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) 

Kích thước của bao nhiêu đoán bạn đang đưa ra sử dụng của bạn dựa trên

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

Vì vậy, nếu số lượng vé họ muốn là ít hơn 5, sau đó mã của bạn ở đây

for i in range(5): 

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

return match 

sẽ ném ra một lỗi vì đơn giản là không có nhiều yếu tố trong danh sách guess.

+0

Cảm ơn bạn rất nhiều.Bây giờ bạn chỉ ra nó, lỗi gần như là hiển nhiên. –

+2

Trên thực tế, lỗi của anh ta đang được thực hiện sớm hơn một chút. Dựa trên câu lệnh đầu vào của mình, 'bong bóng' là một danh sách các chuỗi. Danh sách này sau đó được nối vào 'đoán'. Vì vậy, 'đoán' sẽ trông giống như:' [['12', '30', '12', '23'. '3'], ['4', '5', '7', '8', '16']] '. Phương thức danh sách thích hợp là 'guess.extend()'. Ngoài ra, các giá trị là các chuỗi, vì vậy ngay cả khi chúng so sánh, so sánh sẽ _never_ trả về true. –

0

Tôi nghĩ rằng bạn có ý nghĩa để đưa cán của một ngẫu nhiên, b, c, vv trong vòng lặp:

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) 

Nếu không, a sẽ được tạo ra chỉ lần, và nếu nó là trong winning_numbers rồi, nó sẽ không được thêm vào. Vì thế hệ abên ngoàiwhile (trong mã của bạn), nếu a đã ở trong winning_numbers thì quá tệ, nó sẽ không được cuộn lại và bạn sẽ có ít số chiến thắng hơn.

Đó có thể là nguyên nhân gây ra lỗi của bạn trong if guess[i] == winning_numbers[i]. (winning_numbers của bạn không phải lúc nào cũng dài 5).

+0

Mã này sẽ chỉ chạy _if_ a bằng NOT_numberbers. Nói cách khác, nếu có lặp lại, sẽ không có số nào được thêm vào. Hãy nhớ rằng, trong khi kiểm tra điều kiện chạy trước khi chạy. –

0

Đây là mã của bạn. Tôi giả sử bạn đang sử dụng python 3 dựa trên việc bạn sử dụng 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() 
Các vấn đề liên quan