← Назад к вопросам

Зачем нужна каждая структура данных?

1.0 Junior🔥 291 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Зачем нужна каждая структура данных

Каждая структура данных оптимизирована для определённых операций и сценариев использования. Выбор правильной структуры напрямую влияет на производительность и читаемость кода.

List (Список)

Назначение: упорядоченная коллекция элементов с быстрым доступом по индексу.

# Быстрый доступ O(1)
arr = [1, 2, 3, 4, 5]
print(arr[2])  # 3

# Итерация O(n)
for item in arr:
    print(item)

# Медленный поиск O(n) и вставка O(n)
arr.insert(0, 0)  # вставка в начало — сдвиг всех элементов

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

Tuple (Кортеж)

Назначение: неизменяемая последовательность, используется как ключ в словарях.

# Неизменяемость
coord = (10, 20)
coord[0] = 5  # TypeError

# Как ключ
locations = {
    (0, 0): "начало",
    (10, 20): "точка A",
    (5, 15): "точка B"
}

print(locations[(0, 0)])  # начало

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

Set (Множество)

Назначение: уникальные элементы без порядка, быстрые операции поиска и теоретико-множественные операции.

# Быстрый поиск O(1)
users = {"alice", "bob", "charlie"}
print("alice" in users)  # True за O(1)

# Удаление дубликатов
numbers = [1, 2, 2, 3, 3, 3, 4]
unique = set(numbers)  # {1, 2, 3, 4}

# Теоретико-множественные операции
set_a = {1, 2, 3}
set_b = {2, 3, 4}

print(set_a & set_b)  # пересечение: {2, 3}
print(set_a | set_b)  # объединение: {1, 2, 3, 4}
print(set_a - set_b)  # разница: {1}

Когда использовать: удаление дубликатов, быстрый поиск принадлежности, теоретико-множественные операции.

Dict (Словарь)

Назначение: ключ-значение пары, быстрый доступ O(1) по ключу.

# Быстрый доступ
user = {"name": "Alice", "age": 30, "city": "Moscow"}
print(user["name"])  # Alice за O(1)

# Проверка наличия ключа
if "email" in user:
    print(user["email"])
else:
    print("Email не найден")

# Итерация
for key, value in user.items():
    print(f"{key}: {value}")

# Получение с дефолтом
age = user.get("age", 0)  # 30
email = user.get("email", "unknown@email.com")  # unknown@email.com

Когда использовать: хранение связанных данных, кэширование, быстрый поиск по ключу, конфигурации.

Deque (Двусторонняя очередь)

Назначение: эффективная работа с обоими концами последовательности O(1).

from collections import deque

queue = deque([1, 2, 3, 4, 5])

# Быстрые операции с обоих концов O(1)
queue.appendleft(0)    # добавить слева
queue.append(6)        # добавить справа
queue.popleft()        # удалить слева
queue.pop()            # удалить справа

# Скользящее окно
window = deque(maxlen=3)  # максимум 3 элемента
for i in range(10):
    window.append(i)
    print(list(window))

Когда использовать: очереди (FIFO), стеки (LIFO), скользящие окна, алгоритмы поиска в ширину (BFS).

defaultdict

Назначение: словарь, автоматически создающий значения для отсутствующих ключей.

from collections import defaultdict

# Подсчёт элементов
counter = defaultdict(int)
for word in ["apple", "banana", "apple", "cherry", "apple"]:
    counter[word] += 1

print(counter)  # {apple: 3, banana: 1, cherry: 1}

# Группировка
groups = defaultdict(list)
for num in [1, 2, 1, 3, 2, 4]:
    groups[num % 2].append(num)

print(groups)  # {1: [1, 1, 3], 0: [2, 2, 4]}

Когда использовать: подсчёт частоты, группировка данных, значения по умолчанию.

Counter

Назначение: подсчёт частоты элементов с удобными методами.

from collections import Counter

text = "hello world"
freq = Counter(text)

print(freq.most_common(3))  # [(l, 3), (o, 2), (h, 1)]
print(freq["e"])  # 1

# Объединение счётчиков
count1 = Counter([1, 1, 2])
count2 = Counter([1, 3, 3, 3])
print(count1 + count2)  # Counter({3: 3, 1: 3, 2: 1})

Когда использовать: анализ частотности, топ элементы, подсчёт вхождений.

namedtuple

Назначение: кортеж с именованными полями, более читаемый, чем обычный кортеж.

from collections import namedtuple

Point = namedtuple("Point", ["x", "y"])
p = Point(10, 20)

print(p.x, p.y)  # 10 20
print(p[0], p[1])  # 10 20 — также поддерживает индексацию
print(p)  # Point(x=10, y=20)

Когда использовать: легковесные объекты с именованными полями, возврат структурированных данных.

OrderedDict

Назначение: словарь, сохраняющий порядок вставки элементов (в Python 3.7+ это поведение по умолчанию).

from collections import OrderedDict

od = OrderedDict()
od["first"] = 1
od["second"] = 2
od["third"] = 3

print(list(od.keys()))  # [first, second, third]

Выбор структуры по сценариям

ЗадачаСтруктураПричина
ПоследовательностьListпроизвольный доступ O(1)
Уникальные элементыSetбыстрый поиск O(1)
Неизменяемые данныеTupleзащита, ключи словарей
Ключ-значениеDictбыстрый доступ по ключу
FIFO/LIFO операцииDequeO(1) с обоих концов
Подсчёт частотыCounterвстроенные методы
Группировка данныхdefaultdictавтоматические значения

Выбор правильной структуры данных — это фундамент эффективной программы.

Зачем нужна каждая структура данных? | PrepBro