IndexError: list index out of range, хотя такой ошибки не должно возникнуть

Делаю программу, которая рандомно генерирует слово из массива:

from random import randint

print("Начало")
while True:
    print(["rare", "rare", "rare" "superrare", "superrare", "superrare", "epic", "epic", "mythic", "mythic", "legendary"][randint(0, 10)])

Вот что ввыводит:

Начало
superrare
mythic
epic
legendary
mythic
mythic
mythic
mythic
superrare
mythic
rare

и ошибка:

Traceback (most recent call last):
  File "/sysroot/home/user/PycharmProject/Lunx/main.py", line 9, in <module>
    print(["rare", "rare", "rare" "superrare", "superrare", "superrare", "epic", "epic", "mythic", "mythic", "legendary"][randint(0, 10)])
IndexError: list index out of range

И у меня возникает вопрос: почему?

Всего элементов в массиве: 11

randint(0, 10) генерирует случайное число от 0 до 10, что превращается в индекс массива

Что не так?

Python 3.8 (PyCharm Community Edition)


Ответы (4 шт):

Автор решения: Егор

Я заметил следующее:

from random import randint
print("Начало")
list1 = ["rare", "rare", "rare" "superrare", "superrare", "superrare", "epic", "epic", "mythic", "mythic", "legendary"]
print(len(list1))
print(list1)
while True:
    print(list1[randint(0, 10)])

Вывод следующий:

['rare', 'rare', 'raresuperrare', 'superrare', 'superrare', 'epic', 'epic', 'myt
hic', 'mythic', 'legendary']

Обратите внимание на 3-й (по индексу 2) элемент списка. Python склеил две строки
"rare" "superrare" Поэтому элементов в массиве не 11, а 10. Надеюсь мой ответ помог

→ Ссылка
Автор решения: Zhihar

потому что всего у вас в массиве 11 элементов

когда вы используете randint(0, 11) то получаете числа от 0 до 11 включительно

а у вас значения от [0] до [10] (это как раз 11 элементов), в когда вдруг выпадает 11 и выполняется обращение к [11] - тут и происходит выход за диапазон

поэтому надо делать так:

random.randint(0, len(arr) - 1)

а на самом деле для вашей цели есть специальный метод choice

random.choice(arr)

который все сделает сам - выберет случайно один из элементов массива

→ Ссылка
Автор решения: Акмаль

вот лучший вариант:

import random

words = ["rare", "rare", "rare" "superrare", "superrare", "superrare", "epic", "epic", "mythic", "mythic", "legendary"]

while True:
    print(random.choice(words))
→ Ссылка
Автор решения: Werryx

Я понял. У меня допущена ошибка в ["rare", "rare", "rare" "superrare", "superrare", "superrare", "epic", "epic", "mythic", "mythic", "legendary"] и там есть "rare" "superrare". Также можно использовать random.choice, но я просто не хотел его импортировать

→ Ссылка