Глава 11 · Очень много информации!

Как выбрать правильную структуру

Теперь, когда все четыре коллекции знакомы по отдельности, — как решить, какую использовать в конкретной задаче.

Таблица изменяемости

ТипУпорядочен?Изменяем?Повторы?Доступ
listдададапо индексу
tupleданетдапо индексу
setнет позицийданет — только уникальныепо членству (in)
frozensetнет позицийнетнет — только уникальныепо членству (in)
dictсохраняет порядок вставкидаключи уникальныпо ключу

Таблица хешируемости

Что можно класть в множество / использовать как ключ словаря
Обычно хешируемы
int, float, str
bool, bytes
tuple (если элементы хешируемы)
frozenset
Не хешируемы
list
dict
set

Итоговый ориентир выбора

Полный ориентир выбора структуры
Нужна пара «ключ → значение»?
dict
Иначе: нужны только уникальные значения, порядок не важен?
set
Иначе: нужен порядок, значения точно не изменятся?
tuple
Иначе: нужен порядок и придётся менять содержимое?
list
Правило большого пальца — сначала думайте о задаче, потом о синтаксисе

Истинность коллекций (truthiness)

Из главы 9: пустая коллекция — False в логическом контексте, непустая — True, независимо от значений внутри:

Пусто → FalseНе пусто → True
[][0]
()("",)
set(){0}
{}{"x": None}
truthiness_kollekcij.py
items = []
if items:
    print("Есть элементы")
else:
    print("Список пуст")
if items: — идиоматичнее, чем if len(items) > 0:
Обе записи работают одинаково, но if items: прямо спрашивает «список непустой?», без промежуточного подсчёта длины — это стандартный стиль в Python-коде.

Изменение коллекции во время перебора — ещё одна ловушка

mutation_during_iteration.py
items = [2, 4, 6, 8]
for item in items:
    if item % 2 == 0:
        items.remove(item)
print(items)   # [4, 8] — а не [], хотя условие подходит КАЖДОМУ элементу!
Не меняйте размер коллекции, пока перебираете её тем же циклом
Удаление элементов списка во время перебора этого же списка сдвигает индексы прямо «под ногами» у цикла — часть элементов будет пропущена. Для словаря или множества Python вообще выбросит RuntimeError: dictionary changed size during iteration. Безопасные способы: собирать результат в НОВУЮ коллекцию, использовать comprehension, или перебирать явную копию — for item in items.copy():.
Практика: выбор структуры данных по сценарию
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →