Типы массивов и их применение в языке Python

Раздел: Типы данных -> Массивы

Массивы и их типы в Python

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

numbers = [1, 2, 3, 4, 5]
numbers.append(6)
numbers[0] = 10
print(numbers)  # [10, 2, 3, 4, 5, 6]

Python массив типов (массив типов в python)

Возможные проблемы: частые вставки или удаления в середине списка выполняются за O(n); большой расход памяти по сравнению с array или numpy. Решение - для частых вставок в начало/середину использовать collections.deque.

Как хранить упорядоченные, но неизменяемые данные?

Используется tuple (кортеж). Кортеж быстрее списка, может быть ключом словаря. Элементы не изменяются после создания.

point = (10, 20)
coord = point[0]  # 10
# point[0] = 30  # Ошибка TypeError

Python массивы типы данных (массивы и типы данных в python)

Возможные проблемы: попытка изменить кортеж вызывает ошибку; кортеж с одним элементом требует запятую: (1,). Решение - для одноэлементного кортежа всегда ставить запятую.

Как хранить только уникальные элементы без порядка?

Применяется set (множество). Операции проверки вхождения, объединения, пересечения выполняются за O(1) в среднем.

unique = {1, 2, 3, 2, 1}
print(unique)  # {1, 2, 3}
print(1 in unique)  # True
Возможные проблемы: множество не хранит порядок; элементы должны быть неизменяемыми (числа, строки, кортежи). Решение - для сохранения порядка использовать dict.fromkeys или collections.OrderedDict.

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

Тип frozenset - неизменяемая версия set. Он хешируемый, поэтому может быть ключом dict или элементом другого set.

fs = frozenset([1, 2, 3])
d = {fs: "value"}
print(d[fs])  # value
Возможные проблемы: frozenset не поддерживает добавление/удаление элементов. Если требуется изменять множество, нужно создавать новый frozenset.

Как хранить пары ключ-значение для быстрого доступа?

Словарь dict - ассоциативный массив. Ключи должны быть неизменяемыми (строки, числа, кортежи, frozenset). Доступ по ключу за O(1).

ages = {"Alice": 30, "Bob": 25}
print(ages["Alice"])  # 30
ages["Charlie"] = 35
Возможные проблемы: попытка получить несуществующий ключ вызывает KeyError. Решение - использовать метод get() с значением по умолчанию: ages.get("Unknown", 0).

Как хранить однотипные числовые данные компактно?

Модуль array предоставляет массивы фиксированного типа (typecode). Память экономится по сравнению со списком, но операции медленнее, чем в numpy.

from array import array
arr = array('d', [1.5, 2.7, 3.14])  # 'd' - double
arr.append(4.0)
print(arr)  # array('d', [1.5, 2.7, 3.14, 4.0])
Возможные проблемы: все элементы одного типа; если нужны разные типы, array не подходит. Решение - использовать list или numpy с dtype=object.

Как эффективно работать с многомерными числовыми массивами?

Библиотека NumPy - стандарт для научных вычислений. Поддерживает broadcasting, векторизованные операции, работу с большими данными.

import numpy as np
matrix = np.array([[1, 2], [3, 4]])
print(matrix * 2)
# [[2 4]
#  [6 8]]
Возможные проблемы: нужно устанавливать стороннюю библиотеку; для маленьких массивов накладные расходы на создание велики. Решение - для небольших данных использовать list или array.

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

Ниже приведены более сложные и нестандартные примеры использования различных типов массивов в Python.

Генерация списка с условием (list comprehension)

Пример
squares = [x**2 for x in range(10) if x % 2 == 0]
print(squares)  # [0, 4, 16, 36, 64]
[0, 4, 16, 36, 64]
При использовании сложных выражений comprehension может стать трудночитаемым. Решение - вынести логику в отдельную функцию.

Использование collections.defaultdict для группировки

Пример
from collections import defaultdict
words = ["apple", "banana", "apricot", "blueberry"]
groups = defaultdict(list)
for w in words:
    groups[w[0]].append(w)
print(dict(groups))  # {'a': ['apple', 'apricot'], 'b': ['banana', 'blueberry']}
{'a': ['apple', 'apricot'], 'b': ['banana', 'blueberry']}

Создание frozenset из строки и использование как ключа словаря

Пример
chars = frozenset("hello")
d = {chars: "letters"}
print(d[frozenset("oleh")])  # True, так как frozenset игнорирует порядок
letters
Порядок символов не влияет на ключ, поэтому словарь вернет значение даже при другом порядке в строке.

Массивы array с типом 'I' (unsigned int) и побайтовой записью

Пример
from array import array
arr = array('I', [100, 200, 300])
arr_bytes = arr.tobytes()
print(arr_bytes)  # b'd\x00\x00\x00\xc8\x00\x00\x00,\x01\x00\x00'
b'd\x00\x00\x00\xc8\x00\x00\x00,\x01\x00\x00'

NumPy: broadcasting и векторизованные операции

Пример
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([10, 20])
result = a + b  # broadcasting: b превращается в [[10,20],[10,20]]
print(result)
[[11 22]
 [13 24]]

Применение dict.get() с генерацией значения по умолчанию

Пример
from collections import defaultdict
# альтернатива defaultdict с обычным dict
counter = {}
for char in "hello world":
    counter[char] = counter.get(char, 0) + 1
print(counter)  # {'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}
{'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}

Создание кортежа из генератора и распаковка

Пример
tup = tuple(x for x in range(5) if x % 2 == 1)
a, b = tup[0], tup[1]  # a=1, b=3
print(tup)  # (1, 3)
(1, 3)

Множество set с операциями разности и симметрической разности

Пример
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a - b)  # {1, 2}
print(a ^ b)  # {1, 2, 5, 6}
{1, 2}
{1, 2, 5, 6}

Массивы и типы данных в Python - comments

En
Python массивы типы данных (python)