Массивы в языке Python: выбор инструмента для данных

Раздел: Прочее -> Основные структуры данных

Массивы в Python

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

# Создание списка
arr = [10, 20, 30, 40]
print(arr[0])  # 10
arr.append(50)
print(arr)     # [10, 20, 30, 40, 50]

язык python массивы (массивы в python)

Типичная ошибка:

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

a = [1, 2]
b = a
b.append(3)
print(a)  # [1, 2, 3]

Решение: использовать copy() или срез [:].

Как создать массив фиксированного типа для экономии памяти?

Используйте модуль array. Он создаёт массивы, хранящие элементы только одного типа (например, целые числа, числа с плавающей точкой).

from array import array
arr = array('i', [10, 20, 30])  # 'i' - signed int
print(arr[0])  # 10

Ошибки:

Попытка добавить элемент другого типа вызывает TypeError. Также модуль array не поддерживает многомерные массивы.

Как получить быстрые числовые вычисления и многомерные массивы?

Библиотека NumPy предоставляет объект ndarray – многомерный массив с эффективными операциями.

import numpy as np
arr = np.array([[1, 2], [3, 4]])
print(arr.shape)  # (2, 2)
print(arr + 10)   # [[11 12] [13 14]]

Проблемы:

Необходима установка сторонней библиотеки. Для простых списков NumPy избыточен.

Как создать неизменяемый массив (кортеж)?

Если массив не должен изменять свои элементы, используйте tuple (кортеж).

arr = (1, 2, 3)
# arr[0] = 10  # TypeError

Ограничение:

Кортеж нельзя изменить после создания, но он занимает меньше памяти и может использоваться как ключ словаря.

Как создать массив с помощью генератора (list comprehension)?

Генератор списка позволяет компактно создавать массивы на основе существующих итераций.

squares = [x**2 for x in range(5)]
print(squares)  # [0, 1, 4, 9, 16]

Ошибка:

Слишком сложные генераторы снижают читаемость. Лучше вынести логику в отдельную функцию.

Расширенные примеры работы с массивами

Глубокое копирование списков

Пример
import copy
original = [[1, 2], [3, 4]]
shallow = original.copy()
shallow[0][0] = 99
print(original)  # [[99, 2], [3, 4]]

deep = copy.deepcopy(original)
deep[0][1] = 88
print(original)   # [[99, 2], [3, 4]] – не изменён
print(deep)       # [[99, 88], [3, 4]]
[[99, 2], [3, 4]]
[[99, 2], [3, 4]]
[[99, 88], [3, 4]]

Срезы (slicing) с шагом

Пример
arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(arr[2:8:2])    # [2, 4, 6]
print(arr[::-1])     # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
[2, 4, 6]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

Использование array.array для больших однотипных данных

Пример
from array import array
import sys

list_of_ints = [i for i in range(100000)]
array_of_ints = array('i', list_of_ints)

print(sys.getsizeof(list_of_ints))   # ~800 KB
print(sys.getsizeof(array_of_ints))  # ~400 KB
800000
400000

Многомерные массивы с помощью вложенных списков

Пример
matrix = [[0]*3 for _ in range(3)]
matrix[1][1] = 5
print(matrix)  # [[0, 0, 0], [0, 5, 0], [0, 0, 0]]
[[0, 0, 0], [0, 5, 0], [0, 0, 0]]

NumPy: быстрые поэлементные операции

Пример
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a * b)        # [ 4 10 18]
print(np.dot(a, b)) # 32
[ 4 10 18]
32

Создание массива из кортежа и обратно

Пример
t = (10, 20, 30)
lst = list(t)
lst.append(40)
print(lst)  # [10, 20, 30, 40]
new_tuple = tuple(lst)
print(new_tuple)  # (10, 20, 30, 40)
[10, 20, 30, 40]
(10, 20, 30, 40)

Использование filter() и map() для создания массива

Пример
nums = [1, 2, 3, 4, 5, 6]
evens = list(filter(lambda x: x % 2 == 0, nums))
squared = list(map(lambda x: x**2, evens))
print(evens)    # [2, 4, 6]
print(squared)  # [4, 16, 36]
[2, 4, 6]
[4, 16, 36]

Массивы в Python - comments

En
язык python массивы (python)