Массивы (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 |
Мин. байт |
|---|---|---|---|
|
signed char |
int |
1 |
|
unsigned char |
int |
1 |
|
Py_UNICODE |
Unicode |
2 |
|
signed short |
int |
2 |
|
unsigned short |
int |
2 |
|
signed int |
int |
2 |
|
unsigned int |
int |
2 |
|
signed long |
int |
4 |
|
unsigned long |
int |
4 |
|
float |
float |
4 |
|
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.