Python: «список индекса вне диапазона» при попытке сделать цикл, который выбирает случайные числа - PullRequest
0 голосов
/ 18 октября 2018

Моя задача состоит в том, чтобы рандомизировать карточки с именем и четырьмя категориями, а также извлечь их из текстового файла и сохранить заполненные карточки обратно в другой текстовый файл.Количество рандомизированных карт зависит от пользовательского ввода, за исключением того, что перед отображением этой ошибки оно будет повторяться только несколько раз.

  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

интеллект.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

упражнение.txt

1
2
3
4
5

drool.txt

1
2
3
4
5
6
7
8
9
10

Большое спасибо, и пожалуйста, будьте осторожны со мной.Я новичок.

Ответы [ 4 ]

0 голосов
/ 18 октября 2018

В другом ответе указывается причина, по которой вы получаете ошибку - из-за случайных возвращаемых библиотечной функцией значений.Более общий способ: чтобы избавиться от ошибки «индекс списка вне диапазона», можно безопасно проверить индекс перед доступом к элементу списка.Например,

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]
0 голосов
/ 18 октября 2018

Проблема в том, что если exerlinenum=random.randint(0, 5) равно 5, то индекс выходит за пределы диапазона, поскольку exercise.txt имеет всего 5 записей.(Помните, что python начинает считать индексы с 0)

Если вы посмотрите на другие ваши строки, у вас возникнет та же проблема.(Например, в разведке нет 101 записи, а только 100.) Скорее всего, вы видите это только с помощью упражнений, поскольку вероятность получить 5 из 6 больше, чем получить 100 из 101 возможностей.

0 голосов
/ 18 октября 2018

Вы пытаетесь получить доступ к элементу списка с именем lines5.Этот список содержит 5 элементов, которые считываются из exercise.txt.

В python отсчет начинается с 0, поэтому, если вы хотите получить доступ к первому элементу списка, вы используете lines5[0].Если вы расширите эту логику, вы увидите, что lines5[4] дает вам 5-й элемент lines5, а lines5[5] попытается получить доступ к 6-му элементу, которого нет в вашем списке.

Тогда, ваш пример кода использует random.randint(0, 5) для выбора случайного числа.Это случайное число используется для доступа к элементу lines5.random.randint(0, 5) может вернуть 0, 1, 2, 3, 4 или 5!Если получится вернуть 5, вы получите

IndexError: список индексов вне диапазона

, потому что lines5 содержит только 5 элементов, и выпытаясь получить доступ к 6-му элементу!

Вы можете решить вашу проблему с помощью random.randint(0, 4) добавьте дополнительную строку к exercise.txt

0 голосов
/ 18 октября 2018

Функция random.randint(a,b) возвращает случайное число, включающее a и b.Таким образом, в вашем случае он может возвращать случайное число от 0 до 5.

В python и большинстве языков индексы списка начинаются с 0. Таким образом, ваш список lines5 равен 5, имея индексы изОт 0 до 4. Пожалуйста, измените строку 35 на эту -

exerlinenum=random.randint(0, 4)

И она должна работать без каких-либо проблем.Вам также нужно уменьшить второй аргумент на 1 из всех вызовов random.randint(), чтобы вы не увидели эту ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...