← Все вопросы

Как сделать срез списка в Python (взять часть элементов)?

Задан 7 месяцев назад438 просмотров1 ответ
8

Не до конца понимаю срезы. Хочу взять, например, первые три элемента списка, или последние два, или каждый второй. Как работает синтаксис [start:stop:step] и почему конец иногда «не включается»?

1 ответ

13
✓ Принятый ответ — помог автору

Срез это list[start:stop:step], и главное правило — stop не включается. То есть берутся элементы с индекса start до stop, но stop-й уже не входит.

a = [10, 20, 30, 40, 50]

a[0:3]    # [10, 20, 30]  — индексы 0,1,2, а 3 не входит
a[:3]     # [10, 20, 30]  — start по умолчанию 0
a[2:]     # [30, 40, 50]  — до конца
a[-2:]    # [40, 50]      — последние два
a[::2]    # [10, 30, 50]  — каждый второй (шаг 2)
a[::-1]   # [50,40,30,20,10] — наоборот

Отрицательные индексы считают с конца: -1 это последний элемент, -2 предпоследний.

Почему stop не включается — так длина среза легко считается как stop - start. Например, a[0:3] это ровно 3 элемента. И стыкуются красиво: a[:3] и a[3:] вместе дают весь список без перекрытий.

Два приятных свойства срезов:

  1. Они не падают при выходе за границы: a[2:100] просто вернёт [30, 40, 50], без ошибки (в отличие от a[100], который даст IndexError).
  2. Срез всегда создаёт новый список, оригинал не меняется. Поэтому a[:] — это способ сделать поверхностную копию.

Частая ошибка — ждать, что a[1:3] вернёт 3 элемента. Нет, это два: индексы 1 и 2.

Ваш ответ

, чтобы ответить на вопрос.