2015-12-29 5 views
3

В настоящее время я пытаюсь создать простой код (в основном mad-libs), и я сделал переменную под названием time. Пользователь должен ввести что-то вроде месяцев или дней. Если пользователь вводит день или месяц, if оператор должен добавить "s" сделать это множественное число:IndexError: string index out of range - with len()

time = str(input("Pick a measurement of time (ex. days): ")) 
if time[len(time)] != "s": 
    time = time + "s" 

Когда я проверить этот код, оно дает мне эту ошибку:

Traceback (most recent call last): 
    File "D:/nikis_staff/PROGRAMMING/madlibs.py", line 51, in <module> 
     if time[len(time)] != "s": 
IndexError: string index out of range 

I знаю, что string index out of range означает, что строка длиннее, чем я думал, но я использую len().

+1

Больше идиоматических: 'if not time.endswith (" s "):' – sjakobi

ответ

3

Индексы в Python begin with 0, то есть первый элемент в строке, списке, кортеже и т. Д.: 0. Следовательно, последний элемент s - len(s)-1. Таким образом, time[len(time)] обращается к элементу после последнего элемента, что, конечно, вызывает IndexError. Используйте вместо этого time[len(time) - 1], или еще лучше: time[-1].

Часто вы найдете slicings[-1:], так как он возвращает '' для пустой строки вместо того, чтобы поднимать IndexError.

C.f. http://www.tutorialspoint.com/python/python_lists.htm

+0

Большое вам спасибо! Это сработало: D – nikodem363

+0

Добро пожаловать! Рядом со всеми языками программирования есть индексы на основе нуля. Из языков, которые я знаю, только Pascal/Delphi и Matlab используют 1-основанные индексы. Обоснованием является то, что вычисление намного проще делать в системе на основе 0. – kay

2

Если строка имеет длину 5, например 'hello', то максимальный индекс равен 4, поскольку индексирование основано на нуле (начинается с 0, а не 1).

>>> len('hello') 
5 
>>> 'hello'[4] 
'o' 

Вы можете избежать вычисления длины, используя относительные смещения для индекса. Итак, если вы хотите, последний символ, -1, как это:

>>> 'hello'[-1] 
'o' 
-1

Правильный код:

time = str(input("Pick a measurement of time (ex. days): ")) if time[len(time) - 1] != "s": time = time + "s"

Длина time является len(time), но самый большой показатель timelen(time) - 1, так как индекс начинается с нуля.

Или вы можете просто использовать if time[-1] != "s":, чтобы получить и оценить элемент хвоста.

+0

Не могли бы вы рассказать мне, почему, если вы считаете, что мой ответ не полезен? – cuiqiang1990

Смежные вопросы