Массивы в языке 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]