Глава 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, без установки