Давайте разберем, что собой представляют массивы в Python и как взять срез массива. Если вы еще не знакомы с самой концепцией среза, сразу дадим краткое пояснение. Под получением или взятием среза понимается получение определенных значений из уже имеющегося объекта. Например, можно извлечь несколько первых или последних элементов строки или списка. В этой статье мы остановимся на срезах массивов.
Если вы любите смотреть видеоконтент в дополнение к чтению, вот видеоверсия данной статьи.
БЕСПЛАТНО СКАЧАТЬ КНИГИ по Python на русском языке можно у нас в телеграм канале "Python книги на русском"
Что такое массив
Массив – это упорядоченная структура данных, которая позволяет хранить в переменной одновременно несколько элементов одного типа. К каждому из этих элементов можно получить доступ по индексу.
Это несколько похоже на списки (list) в Python. Но списки позволяют хранить элементы различных типов данных. Кроме того, списки сами по себе являются встроенным типом данных, в отличии от массивов.
Как получить доступ к значениям в массиве в Python
Вот синтаксис для создания массива в Python:
import array as arr numbers = arr.array(typecode, [values])
Поскольку тип данных array не встроен в Python по умолчанию, его необходимо загрузить из модуля array. Мы импортируем его под именем arr
.
Используя метод array
, мы можем создать массив, указав в качестве аргументов typecode
(тип данных значений) и [values]
, то есть сами значения, которые будут храниться в массиве.
Вот таблица с допустимыми значениями параметра typecode:
TYPECODE | Тип в C | Тип в Python | Размер, байты |
---|---|---|---|
‘b’ | signed char | int | 1 |
‘B’ | unsigned char | int | 1 |
‘u’ | wchar_t | Символ Unicode | 2 |
‘h’ | signed short | int | 2 |
‘H’ | unsigned short | int | 2 |
‘i’ | signed int | int | 2 |
‘I’ | unsigned int | int | 2 |
‘l’ | signed long | int | 4 |
‘L’ | unsigned long | int | 4 |
‘q’ | signed long long | int | 8 |
‘Q’ | unsigned long long | int | 8 |
‘f’ | float | float | 4 |
‘d’ | double | float | 8 |
Значения параметра typecode
взяты из документации Python.
Вот пример использования модуля array в Python:
import array as arr numbers = arr.array('i', [1, 2, 3, 4, 5]) print(numbers[1]) # 2
Здесь мы создали массив целочисленных значений от 1 до 5. Мы также получили доступ ко второму элементу, используя квадратные скобки и его индекс, который равен 1.
Как получить срез массива в Pyhton
Допустим, вы хотите получить срез массива Python и сохранить результат в новую переменную. Это можно сделать, используя квадратные скобки и двоеточие. Синтаксис будет выглядеть следующим образом:
array[start:stop:step]
Параметр start
указывает индекс, с которого начинается срез. Его значение по умолчанию равно 0. Параметр stop
указывает, до какого индекса продолжается срез. Значение под индексом, указанным как stop
, в срез не входит. Параметр step
определяет шаг среза. По умолчанию он равен 1.
Давайте рассмотрим несколько примеров, которые иллюстрируют различные способы получения срезов массива.
Срез массива без указания start и stop
Когда вы делаете срез без указания начального и конечного индекса, то получаете точную копию вашего массива:
import array as arr numbers = arr.array('i', [1, 2, 3, 4, 5]) copy = numbers[:] print(copy) # array('i', [1, 2, 3, 4, 5])
Как видите, мы получили копию массива numbers
.
Также стоит отметить, что взятие среза не влияет на исходный массив. Мы только копируем часть исходного массива, в данном случае весь целиком.
Как получить срез массива, начиная с определенного индекса
Например, мы хотим получить срез массива от некоторого начального значения до конца этого массива. Вот как это можно сделать:
import array as arr numbers = arr.array('i', [1, 2, 3, 4, 5]) copy = numbers[2:] print(copy) # array('i', [3, 4, 5])
[2:]
означает, что срез берется от индекса 2 (третье значение массива) и до конца массива. Результат это наглядно показывает.
Как взять срез массива до определенного индекса
Например, мы хотим получить срез массива, чтобы в него вошли элементы от первого до третьего. Вот как это можно сделать:
import array as arr numbers = arr.array('i', [1, 2, 3, 4, 5]) copy = numbers[:3] print(copy) # array('i', [1, 2, 3])
[:3]
означает, что срез начинается с индекса 0 (поскольку иного индекса не указано) до индекса 3, который задан в явном виде.
Как уже говорилось ранее, в срез не входит значение по индексу 3. Таким образом в результате возвращено значение от 0 до индекса 2 включительно.
Как получить срез массива с индексами start и stop
Допустим, вам нужны элементы массива со второго по четвертый. Вот как это будет выглядеть:
import array as arr numbers = arr.array('i', [1, 2, 3, 4, 5]) copy = numbers[1:4] print(copy) # array('i', [2, 3, 4])
Два числа, разделенные двоеточием, обозначают начальный и конечный индексы (start
и stop
). В данном случае это были числа 1 и 4. Из результата видно, что срез начинается со значения массива под индексом 1. Это значение равно 2. Заканчивается срез значением, которое идет перед элементом под индексом 4. Оно равно 4, а его индекс равен 3.
Как создать срез с использованием шага
Когда мы указываем значения start
и stop
1 и 5 соответственно, то в срез входят значения массива под индексами 1, 2 (приращение 1 здесь и далее), 3 и 4. В данном случае шаг выборки по умолчанию равен 1. Но, что если мы хотим выбирать значения с другим шагом? А вот что:
import array as arr numbers = arr.array('i', [1, 2, 3, 4, 5]) copy = numbers[1:4:2] print(copy) # array('i', [2, 4])
Добавив еще одно двоеточие, можно задать величину шага (step
). Теперь наш синтаксис имеет следующий вид: [start:stop:step]
.
В нашем примере start
– 1, stop
– 4 и step
– 2. Срез начинается со значения по индексу 1, которое равно 2. Индекс следующего значения получается путем прибавления к индексу первого элемента (1) числа 2 (шаг у нас равен двум), то есть 1 + 2 = 3. Значение по индексу 3 равно 4 и оно добавляется в наш срез. Следующий индекс будет равен 5 (потому что 3 + 2), но так как по такому индексу в исходном массиве никакого значения нет, то далее в срез ничего добавляться не будет.
Как можно заметить, полученный срез включает в себя значения 2 и 4.
Отрицательные значения start и stop в срезах
Значения параметров start
и stop
могут быть и отрицательными. Отрицательные индексы отсчитываются от конца массива. Это означает, что отрицательный индекс -1 является последним значением в массиве:
import array as arr numbers = arr.array('i', [1, 2, 3, 4, 5]) print(numbers[-1]) # 5
Можно заметить, что при вызове значения по индексу -1 мы получили значение 5 – последний элемент массива.
Рассмотрим срез [-3:-1]
. Здесь индекс начального элемента равен -3, а конечного -1. Давайте посмотрим? как это будет работать с нашим массивом:
import array as arr numbers = arr.array('i', [1, 2, 3, 4, 5]) copy = numbers[-3:-1] print(copy) # array('i', [3, 4])
Срез начинается с индекса -3 (это третье значение с конца массива, т.е. 3) и останавливается на индексе -1 (это последнее значение в массиве, 5). Последнее значение в срез не входит, поэтому мы получаем значения 3 и 4.
Сочетание отрицательного начального индекса и положительного конечного индекса (или наоборот) не сработает, так как мы будем пытаться двигаться в разных направлениях одновременно, что невозможно.
Как создать срез массива с отрицательным шагом
Мы можем использовать отрицательные шаги, что означает уменьшение индекса. Вот пример:
import array as arr numbers = arr.array('i', [1, 2, 3, 4, 5]) copy = numbers[2::-1] print(copy) # array('i', [3, 2, 1])
Здесь мы указываем в качестве начала среза индекс 2, конец среза не обозначаем и берем шаг равным -1. Таким образом, срез начинается со значения по индексу 2, которое равно 3. Отрицательный шаг означает, что следующее значение в срезе будет иметь индекс меньше предыдущего на 1. То есть индекс следующего значения будет 2 – 1 = 1. По индексу 1 у нас находится значение 2, которое и будет добавлено в наш срез.
Эта процедура будет продолжаться, пока не дойдет до индекса 0. Таким образом наш срез будет содержать значения 3, 2 и 1 (именно в таком порядке).
Что значит [::-1]
Вы когда-нибудь уже видели это выражение в Python? Вот что мы видим: ни начального, ни конечного индекса не указано, только задан отрицательный шаг.
Начальный индекс по умолчанию равен 0, поэтому при использовании шага -1 срез будет содержать значения со следующими индексами: -1 (0 – 1), -2 (-1 – 1), -3 (-2 – 1), -4 (-3 – 1) и -5 (-4 – 1). Смахивает на копию массива в обратном порядке.
Вот код данного примера:
import array as arr numbers = arr.array('i', [1, 2, 3, 4, 5]) copy = numbers[::-1] print(copy) # array('i', [5, 4, 3, 2, 1])
Как мы и предполагали, это просто копия массива, записанная в обратном порядке.
Заключение
В этой статье мы кратко рассмотрели, как объявлять массивы в Python, как получить доступ к значениям в массиве, а также как взять срез массива, используя двоеточие и квадратные скобки. Мы разобрали, как создавать срезы с положительными и отрицательными индексами, а также как использовать положительный и отрицательный шаг.
Перевод статьи Dillion Megida Python “Slicing – How to Slice an Array and What Does [::-1] Mean?”
Пингбэк: Что такое массивы в Python и как их использовать - pythonturbo
Пингбэк: Как получить последний символ строки в Python