19 Доступ к значениям списка

Списки Python имеют нулевую индексацию и действуют как массивы в других языках.

 lst = [1, 2, 3, 4]
lst[0]  # 1
lst[1]  # 2

 

Попытка получить доступ к индексу за пределы списка возбудит IndexError .

 lst[4]  # IndexError: list index out of range

 

Отрицательные показатели интерпретируются как отсчет от конца списка.

 lst[-1]  # 4
lst[-2]  # 3
lst[-5]  # IndexError: list index out of range

 

Это функционально эквивалентно

 lst[len(lst)-1]  # 4

 

Списки позволяют использовать ломтик обозначение , как lst[start:end:step] . Выход среза обозначений представляет собой новый список , содержащий элементы из индекса start до end-1 . Если параметры опущены start значения по умолчанию для начала списка, end в конец списка и step 1:

 lst[1:]      # [2, 3, 4]
lst[:3]      # [1, 2, 3]
lst[::2]     # [1, 3]
lst[::-1]    # [4, 3, 2, 1] 
lst[-1:0:-1] # [4, 3, 2]
lst[5:8]     # [] since starting index is greater than length of lst, returns empty list
lst[1:10]    # [2, 3, 4] same as omitting ending index

 

Имея это в виду, вы можете распечатать обратную версию списка, вызвав

 lst[::-1]    # [4, 3, 2, 1]

 

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

 lst[3:1:-1] # [4, 3]

 

Использование индексов отрицательных шагов эквивалентно следующему коду:

 reversed(lst)[0:2] # 0 = 1 -1
                   # 2 = 3 -1

 

Используемые индексы на 1 меньше, чем используемые при отрицательной индексации, и обращены.

Продвинутая нарезка

Когда списки нарезали __getitem__() метод объекта списка называется, с slice объектом. В Python есть встроенный метод среза для генерации объектов среза. Мы можем использовать это , чтобы сохранить кусочек и использовать его позже , как это так,

 data = 'chandan purohit    22 2000'  #assuming data fields of fixed length 
name_slice = slice(0,19)
age_slice = slice(19,21)
salary_slice = slice(22,None)

#now we can have more readable slices
print(data[name_slice]) #chandan purohit     
print(data[age_slice]) #'22'
print(data[salary_slice]) #'2000'

 

Это может быть очень полезным, предоставляя функциональность для нарезки наших объектов путем переопределения __getitem__ в нашем классе.