Python:尝试执行选择随机数的循环时,“列表索引超出范围”

时间:2018-10-18 08:39:08

标签: python loops indexing

我的任务是将具有名称和四个类别的卡片随机化,并将其从文本文件中取出,然后将完成的卡片保存回另一个文本文件中。随机分配的卡数取决于用户输入,除非它在显示此错误之前只会循环几次。

  line 35, in <module>
  exercise = lines5[exerlinenum]
IndexError: list index out of range

这是我正在使用的代码。

x = 0
list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 
20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]
user = int(input("Please enter your even number: "))
if user % 2 == 0:
     answer = list.index(user)
     split_list = list[0:answer+1]
     loop = len(split_list)

else:
     print("Input not even!")
     import random
     while x < loop:

         file = open("dognames.txt", "r")
         lines1=file.readlines()
         namelinenum=random.randint(0, 17)
         dogname = lines1[namelinenum]
         print("Name:", dogname)

         file2 = open("friendliness.txt", "r")
         lines2=file2.readlines()
         frenlinenum=random.randint(0, 10)
         friendliness = lines2[frenlinenum]
         print("Friendliness:", friendliness)

         file4 = open("intelligence.txt", "r")
         lines4=file4.readlines()
         intlinenum=random.randint(0, 100)
         intelligence = lines4[intlinenum]
         print("Intelligence:", intelligence)

         file5 = open("exercise.txt", "r")
         lines5=file5.readlines()
         exerlinenum=random.randint(0, 5)
         exercise = lines5[exerlinenum]
         print("Exercise:", exercise)

         file6 = open("drool.txt", "r")
         lines6=file6.readlines()
         droollinenum=random.randint(0, 10)
         drool = lines6[droollinenum]
         print("Drool:", drool)

         doginfo=(dogname, friendliness, intelligence, exercise, drool)
         file3 = open("dogs.txt", "a")
         file3.write(repr(doginfo))



         x += 1

    file3.close()

这是有问题的文本文件,如果有帮助的话。

dognames.txt

 Jack
 Harry
 Lyla
 Lucky
 Ringo
 Sadie
 Pinkie
 Teddy
 Simrin
 Andie
 Willow
 Luna
 Bailey
 Zoey
 Checkers
 Cheddar
 Arlo
 Humphrey

friendliness.txt

1
2
3
4
5
6
7
8
9
10

intelligence.txt

1
2
3
4
5
6
7
8
9
10
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 
81 
82 
83 
84 
85 
86 
87 
88 
89 
90 
91 
92
93
94 
95
96
97 
98
99
100

exercise.txt

1
2
3
4
5

drool.txt

1
2
3
4
5
6
7
8
9
10

非常感谢,请对我轻松一点。我是初学者。

4 个答案:

答案 0 :(得分:2)

函数random.randint(a,b)返回一个随机数,其中包含ab。因此,根据您的情况,它可以返回0到5之间的随机数。

在python和大多数语言中,列表索引从0开始。因此,您的lines5列表大小为5,索引从0到4。请将第35行更改为此-

exerlinenum=random.randint(0, 4)

它应该可以正常工作。 您还需要将所有random.randint()调用中的第二个参数减少1个,以免看不到此错误。

答案 1 :(得分:1)

问题在于,如果exerlinenum=random.randint(0, 5)5,则索引超出范围,因为exercise.txt仅具有5个条目。 (请记住,python从0开始计数索引)

看看其他行,您有同样的问题。 (例如,情报没有101个条目,而只有100个条目。)您很可能只在锻炼时才能看到它,因为从6个中获得5个的可能性大于从101个可能性中获得100个可能性。

答案 2 :(得分:1)

您正在尝试访问名为lines5的列表的元素。此列表包含从exercise.txt中读取的5个元素。

在python中,计数从0开始,因此,如果要访问列表的第一个元素,请使用lines5[0]。如果扩展此逻辑,则会看到lines5[4]为您提供了lines5的第5个元素,而lines5[5]将尝试访问列表中不存在的第6个元素。 / p>

然后,您的代码示例使用random.randint(0, 5)选择一个随机数。该随机数用于访问lines5的元素。 random.randint(0, 5)可能返回0、1、2、3、4或5!如果碰巧返回5,您将被击中

  

IndexError:列表索引超出范围

因为lines5仅包含5个元素,而您正在尝试访问第6个元素!

您可以使用random.randint(0, 4) <{1}}

解决您的问题

答案 3 :(得分:0)

另一个答案说明了您收到错误的原因-由于随机库函数返回值。更通用的是,要摆脱“列表索引超出范围”错误,可以安全地在访问列表项之前检查索引。例如,

if line5: # make sure the list is not empty
    if exerlinenum >= len(line5): # index out of range
        # throw error or what ever
    else:
        exercise = lines5[exerlinenum]