Список: создание, индексы и срезы
Уроки курсаСписок: создание, индексы и срезы
Срез списка [start:stop:step]: синтаксис и примеры
Индекс даёт доступ к одному элементу. Срез — к нескольким сразу. Результатом среза всегда является новый список, а исходный остаётся нетронутым.
Синтаксис: lst[start:stop:step], где:
start— позиция, с которой начинается выборка (элемент включается);stop— позиция, на которой выборка заканчивается (элемент не включается);step— шаг между позициями.
Любой из трёх параметров можно опустить. По умолчанию start = 0, stop = конец списка, step = 1.
Разберём на конкретном списке:
lst = [0, 1, 2, 3, 4, 5]
print(lst[1:4]) # [1, 2, 3] — элементы с позиции 1 до 3 (4 не входит)
print(lst[::2]) # [0, 2, 4] — каждый второй элемент от начала до конца
print(lst[1:5:2]) # [1, 3] — каждый второй в диапазоне 1..4
Граница stop не включается — это то же правило, что и в range(start, stop). Если написать lst[1:4], Python берёт позиции 1, 2, 3, но не 4. Поначалу это сбивает с толку, но логика одна: stop - start при шаге 1 всегда равно количеству элементов в срезе.
Опущенные параметры работают предсказуемо:
print(lst[:3]) # [0, 1, 2] — от начала до позиции 2
print(lst[3:]) # [3, 4, 5] — от позиции 3 до конца
print(lst[:]) # [0, 1, 2, 3, 4, 5] — копия всего списка
lst[:] — стандартный способ сделать поверхностную копию списка. Оригинал и копия — два разных объекта.
Отрицательные границы в срезе работают так же, как отрицательные индексы при одиночном обращении — они считаются с конца:
print(lst[-3:]) # [3, 4, 5] — последние три элемента
print(lst[:-2]) # [0, 1, 2, 3] — всё, кроме последних двух
lst[-3:] удобно читать как «дай мне хвост длиной три элемента» — и длину списка при этом знать не нужно.
Отрицательный шаг разворачивает направление обхода. При step = -1 Python идёт от start к stop в обратную сторону, поэтому start должен быть правее stop (или оба опущены):
print(lst[::-1]) # [5, 4, 3, 2, 1, 0] — весь список в обратном порядке
print(lst[4:1:-1]) # [4, 3, 2] — от позиции 4 до позиции 2 включительно, назад
lst[::-1] — самый компактный способ перевернуть список. Он возвращает новый список в обратном порядке, исходный не трогает.
Важное отличие среза от обращения по индексу: срез никогда не бросает IndexError, даже если границы выходят за пределы списка. Python просто молча обрезает диапазон до допустимого:
print(lst[1:100]) # [1, 2, 3, 4, 5] — stop обрезается до конца списка
print(lst[10:20]) # [] — диапазон вне списка, возвращается пустой список
Это полезно знать: если срез вернул пустой список, это не ошибка — просто диапазон не попал ни в один элемент.
