Проблема с подбором значений из списка

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

from random import randint
choice,howmuch=0,0
Plan=['Celeste','Cuphead','ELDEN RING','HellBlade - Senuas Sacrifice','WHAT THE GOLF']
FromDownloaded=['Celeste','Cuphead','ELDEN RING','HellBlade - Senuas Sacrifice','WHAT THE GOLF','The Binding of Isaac:Rebirth','Counter-Strike 2','DUSK','The Elder Scrolls V: Skyrim','Heavy Rain','It Steals','Left 4 Dead 2','OMORI','PUSS!','VRChat','Windowkill']
#AllGames =[str(x).replace("в„ў","").replace('\n','') for x in open('Список_Игр.txt')]
print('1. План','2. Загружены','3. Все игры',sep='\n')
choice = int(input())
print('Сколько?',sep='\n')
howmuch = int(input())
for _ in range(howmuch):
    if choice == 1:
        print(Plan[randint(0,len(Plan))])
    elif choice == 2:
        print(FromDownloaded[randint(0,len(FromDownloaded))])
    #elif choice == 3:
        #print(AllGames[randint(0,len(AllGames))])
    else:
        print('')
input()

Пример ошибки

Пример ошибки 2


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

Автор решения: Alexey Trukhanov

Первую ошибку достаточно перевести на русский язык - если в input() пользователь введет пустую строку - '', то интерпретатор выдаст ошибку, что он не может конвертировать пустую строку в int(). В общем случае ту же самую ошибку вы получите если введете в int(input()) любую последовательность содержащую что-то кроме цифр. Чтобы этого избежать, можно, например, воспользоваться методом isdigit(), который принимает строку и возвращает True если все символы в последовательности являются цифрами, и False в противном случае. Как-то так:

while not (input_string := input('Выбор пункта меню:')).isdigit():
    print('Неверный ввод')
choice = int(input_string)

Не забудьте, что у вас еще есть howmuch = int(input()), с той же проблемой. И если в случае с choice вы можете обойтись и проще - убрать конвертацию в int(), а работать прям со строками, вот так:

choice = input()
# --- дальше ваш код
# --- в условиях меняем числа на строки
    if choice == '1':
# --- далее везде

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

Вторая ошибка возникает из-за того, что функция randint() как аргументы принимает закрытый интервал (то есть, второй аргумент, верхний предел, входит в интервал). Таким образом у вас получается, что вы пытаетесь сгенерировать случайный индекс в диапазоне от 0 до len(Plan) (включительно!) и подставить его в список Plan, в котором максимальный индекс равен len(Plan)-1. Разумеется, когда генератор случайных чисел выдаст вам значение len(Plan), вы получите ошибку, что такого индекса нет в списке, потому, что полученный индекс на единицу больше максимального. Значит надо генерировать случайное число в диапазоне от 0 до len(Plan)-1.

print(Plan[randint(0,len(Plan)-1)])
→ Ссылка