Механизм срезов

При работе с индексированными последовательностями (среди которых мы знаем списки, кортежи и строки) кроме извлечения одного элемента по целочисленному индексу вы можете воспользоваться срезом (slice) для извлечения последовательности. Срез может содержать начальный индекс, необязательный конечный индекс и необязательное приращение (все значения разделяются двоеточиями).

Приведем пример среза для извлечения первых двух элементов списка

>>> fruits = ["apple", "pineapple", "pear", "banana"]

>>> fruits[0:2]
['apple', 'pineapple']

Напомним, что в Python используются полуоткрытые интервалы. Список доходит до конечного индекса, но не включает его.

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

>>> fruits = ["apple", "pineapple", "pear", "banana"]

>>> fruits[0:2]
['apple', 'pineapple']

>>> fruits[:2]
['apple', 'pineapple']

В срезах также могут использоваться отрицательные индексы. Отрицательной может быть как начальная, так и конечная позиция. Напоминаем, что индекс -1 представляет последний элемент. Если срез распространяется до последнего элемента, вы получите все, кроме этого элемента.

>>> fruits = ["apple", "pineapple", "pear", "banana"]

>>> fruits[:-1]
['apple', 'pineapple', 'pear']

>>> fruits[:-2]
['apple', 'pineapple']

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

>>> fruits = ["apple", "pineapple", "pear", "banana"]

>>> fruits[1:]
['pineapple', 'pear', 'banana']

>>> fruits[2:]
['pear', 'banana']

>>> fruits[-2:]
['pear', 'banana']

>>> fruits[-1:]
['banana']

Наконец, для начального и конечного индекса могут использоваться значения по умолчанию. Если оба индекса отсутствуют, то возвращаемый срез проходит от начала до конца (и содержит копию списка). Эта конструкция может использоваться для быстрого копирования списков

>>> fruits = ["apple", "pineapple", "pear", "banana"]

>>> fruits[:]
['apple', 'pineapple', 'pear', 'banana']

Приращения в срезах

После начального и конечного индекса срез также может получать приращение (его еще называют шагом или страйдом - stride).. Если приращение не задано, по умолчанию используется значение 1. Приращение 1 означает, что из последовательности извлекается каждый элемент между индексами. С приращением 2 берется каждый второй элемент, с приращением 3 - каждый третий и так далее.

>>> fruits = ["apple", "pineapple", "pear", "banana"]

>>> fruits[1::2]
['pineapple', 'banana']

>>> fruits[::3]
['apple', 'banana']

Приращение может быть отрицательным. Приращение -1 означает, что вы двигаетесь в обратном направлении справа налево. Чтобы использовать отрицательное приращение, укажите значение начального индекса больше конечного. Исключением является ситуация, в которой опущен как начальный, и так и конечный индекс: приращение -1 переставляет элементы последовательности в обратном порядке.

>>> fruits = ["apple", "pineapple", "pear", "banana"]

>>> fruits[3:1:-1]
['banana', 'pear']

>>> fruits[:1:-1] # началом считается последний элемент
['banana', 'pear']

>>> fruits[:2:-1] # началом считается последний элемент
['banana']

>>> fruits[::-1] # обратный порядок элементов
['banana', 'pear', 'pineapple', 'apple']

>>> fruits[-4:-2:-1] # начальный индекс меньше конечного
[]

>>> fruits[2::-1] # конечным индексом считается 0
['pear', 'pineapple', 'apple']

>>> fruits[2:4:-1] # начальный индекс меньше конечного
[]

Last updated