Массивы (Array) в Python

В этом руководстве мы сосредоточимся на модуле array. Модуль array позволяет хранить коллекцию числовых значений.

Примечание

Когда говорят о массивах в Python, чаще всего имеют в виду списки Python. Если это ваш случай, см. руководство по спискам.


Создание массивов

Чтобы создать массив числовых значений, нужно импортировать модуль array. Например:

import array as arr
a = arr.array('d', [1.1, 3.5, 4.5])
print(a)

Вывод

array('d', [1.1, 3.5, 4.5])

Здесь мы создали массив типа float. Буква d — код типа. Это определяет тип массива при создании.

Часто используемые коды типов:

Код

C Type

Python Type

Мин. байт

b

signed char

int

1

B

unsigned char

int

1

u

Py_UNICODE

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

f

float

float

4

d

double

float

8

Мы не будем обсуждать разные C-типы в этой статье. Будем использовать два кода типа: i для целых и d для вещественных.

Примечание

Код типа u для символов Unicode устарел с версии 3.3. Избегайте его использования.


Доступ к элементам массива

Мы используем индексы для доступа к элементам массива:

import array as arr
a = arr.array('i', [2, 4, 6, 8])

print("First element:", a[0])
print("Second element:", a[1])
print("Last element:", a[-1])

Вывод

First element: 2
Second element: 4
Last element: 8

Примечание

Индекс начинается с 0 (не с 1), как в списках.


Срезы массивов

Можно получить диапазон элементов массива с помощью оператора среза :.

import array as arr

numbers_list = [2, 5, 62, 5, 42, 52, 48, 5]
numbers_array = arr.array('i', numbers_list)

print(numbers_array[2:5]) # с 3-го по 5-й
print(numbers_array[:-5]) # с начала по 4-й
print(numbers_array[5:])  # с 6-го до конца
print(numbers_array[:])   # с начала до конца

Вывод

array('i', [62, 5, 42])
array('i', [2, 5, 62])
array('i', [52, 48, 5])
array('i', [2, 5, 62, 5, 42, 52, 48, 5])

Изменение и добавление элементов

Массивы изменяемы; их элементы можно изменять подобно спискам.

import array as arr

numbers = arr.array('i', [1, 2, 3, 5, 7, 10])

# изменение первого элемента
numbers[0] = 0
print(numbers)     # Вывод: array('i', [0, 2, 3, 5, 7, 10])

# изменение 3-го по 5-й элементы
numbers[2:5] = arr.array('i', [4, 6, 8])
print(numbers)     # Вывод: array('i', [0, 2, 4, 6, 8, 10])

Вывод

array('i', [0, 2, 3, 5, 7, 10])
array('i', [0, 2, 4, 6, 8, 10])

Можно добавить один элемент через append() или несколько через extend().

import array as arr

numbers = arr.array('i', [1, 2, 3])

numbers.append(4)
print(numbers)     # Вывод: array('i', [1, 2, 3, 4])

# extend() добавляет итерируемый объект в конец массива
numbers.extend([5, 6, 7])
print(numbers)     # Вывод: array('i', [1, 2, 3, 4, 5, 6, 7])

Вывод

array('i', [1, 2, 3, 4])
array('i', [1, 2, 3, 4, 5, 6, 7])

Также можно объединить два массива через оператор +.

import array as arr

odd = arr.array('i', [1, 3, 5])
even = arr.array('i', [2, 4, 6])

numbers = arr.array('i')   # создание пустого массива целых
numbers = odd + even

print(numbers)

Вывод

array('i', [1, 3, 5, 2, 4, 6])

Удаление элементов массива

Можно удалить один или несколько элементов с помощью оператора del.

import array as arr

number = arr.array('i', [1, 2, 3, 3, 4])

del number[2]  # удаление третьего элемента
print(number)  # Вывод: array('i', [1, 2, 3, 4])

del number  # удаление всего массива
print(number)  # Ошибка: массив не определён

Вывод

array('i', [1, 2, 3, 4])
Traceback (most recent call last):
  File "<string>", line 9, in <module>
    print(number)  # Error: array is not defined
NameError: name 'number' is not defined

Можно использовать remove() для удаления элемента и pop() для удаления по индексу.

import array as arr

numbers = arr.array('i', [10, 11, 12, 12, 13])

numbers.remove(12)
print(numbers)   # Вывод: array('i', [10, 11, 12, 13])

print(numbers.pop(2))   # Вывод: 12
print(numbers)   # Вывод: array('i', [10, 11, 13])

Вывод

array('i', [10, 11, 12, 13])
12
array('i', [10, 11, 13])

Списки vs Массивы

В Python списки можно использовать как массивы. Однако мы не можем ограничить тип элементов, хранящихся в списке. Например:

# элементы разных типов
a = [1, 3.5, "Hello"]

Если создавать массивы через модуль array, все элементы должны быть одного числового типа.

import array as arr
# Ошибка
a = arr.array('d', [1, 3.5, "Hello"])

Вывод

Traceback (most recent call last):
  File "<string>", line 3, in <module>
    a = arr.array('d', [1, 3.5, "Hello"])
TypeError: must be real number, not str

Когда использовать массивы?

Списки гораздо гибче массивов. Они могут хранить элементы разных типов данных, включая строки. А для математических вычислений на массивах и матрицах лучше использовать что-то вроде NumPy.

Так каково применение массивов из модуля array?

Тип array.array — это тонкая обёртка над массивами C, которая обеспечивает эффективное по памяти хранение базовых C-типов данных. Если нужен массив, который не будет меняться, массивы могут быть быстрее и потреблять меньше памяти, чем списки.

Если вам действительно не нужны массивы (модуль array может потребоваться для интерфейса с C-кодом), использование модуля array не рекомендуется.

См. также: Матрицы и NumPy-массивы в Python.