Модуль 4 · Урок 15 із 58

Множини: membership, дедуплікація й порівняння

Set моделює унікальність і належність, а не позицію. Він корисний для allowed values, already-seen IDs і порівняння двох наборів. Якщо бізнесу важливий порядок або кількість повторів, перетворення в set може знищити потрібну інформацію.

setfrozensetmembershipdedup

Безпечна практика модуля 4

Пакет містить тільки synthetic records, pure collection functions, import-safe CLI і локальні tests. Жодних персональних чи production-даних, secrets, мережевих викликів або зовнішніх залежностей.

Завантажити практичний пакет →

Set contract: distinct hashable elements

allowed = {"standard", "urgent", "review"}
route = "urgent"

if route not in allowed:
    raise ValueError("unsupported route")

Set не має index або slice. Його elements мають бути hashable; list, dict і mutable set не підходять. frozenset immutable і може бути element іншого set або dict key, якщо domain справді потребує composite unordered key.

Порожня множина — set(), не {}

seen_ids = set()
empty_mapping = {}

print(type(seen_ids).__name__)      # set
print(type(empty_mapping).__name__) # dict

Ця різниця проста, але failure проявляється пізніше, коли code викликає add на dict. Type assertion у маленькому negative case одразу показує проблему.

Dedup може бути lossy operation

ids = ["c2", "c1", "c2", "c3"]
unique_unordered = set(ids)
unique_in_order = list(dict.fromkeys(ids))

Set прибирає duplicates, але не є контрактом стабільного presentation order. Якщо потрібен first-seen order, побудуйте його явно. Якщо треба знати частоту повторів, set взагалі недостатній — зберігайте counts або duplicate evidence окремо.

Set algebra робить reconciliation читабельною

expected = {"c1", "c2", "c3"}
observed = {"c2", "c3", "c4"}

missing = expected - observed
unexpected = observed - expected
matched = expected & observed
all_ids = expected | observed

Difference має напрямок: expected - observed і observed - expected відповідають на різні питання. Symmetric difference ^ показує обидві сторони mismatch, але для звіту краще назвати missing і unexpected окремо.

Mutation під час iteration — сигнал змінити алгоритм

Не додавайте й не видаляйте elements того самого set під час iteration. Спершу обчисліть окремий result або ітеруйте snapshot. Методи add, update, discard мутують set; оператори |, &, - створюють новий result.

MembershipЧи value дозволене або вже бачене.
DedupЧи можна втратити order і frequency.
CompareMissing, unexpected, matched.
OutputПеред display зробіть sorted, якщо потрібен детермінізм.

Definition of Done

  • Set використано лише там, де position і duplicate count не є даними.
  • Порожній set створено через set().
  • Elements hashable, normalization відбулася до membership.
  • Reconciliation називає direction difference.
  • User-facing output має явний deterministic order.

Методичні джерела

Урок, сценарії, пояснення й вправи створені SEOWORK. Посилання ведуть лише на офіційну документацію Python.

Практична перевірка · урок 15 з 47

Закріпіть матеріал уроку

Три сценарні питання. Для зарахування уроку потрібно дати щонайменше дві правильні відповіді.

1. Потрібно перевіряти, чи route належить до невеликого набору дозволених labels, без позицій і повторів. Який collection описує intent?
2. Який literal створює порожній dictionary, а не порожній set, і через це не підтримує method add?
3. Input list містить повторні IDs, а аналітику потрібні frequency і first-seen order. Чому просто set(ids) недостатньо?