Множина — це невпорядкована колекція **унікальних** елементів. Множини мутабельні, але елементи мають бути хешабельними (незмінні типи: рядки, числа, кортежі). Множини не підтримують індексування — `s[0]` неможливо.
## Створення множин
```python
s = {1, 2, 3}
empty = set() # НЕ {} — це створює порожній словник!
from_list = set([1, 2, 2, 3, 3])
print(from_list) # {1, 2, 3} — дублікати видаляються автоматично
```
## Додавання і видалення
```python
s = {1, 2, 3}
s.add(4) # додає 4 до множини
s.add(2) # без ефекту — 2 вже є
print(s) # {1, 2, 3, 4}
s.remove(3) # видаляє 3 — кидає KeyError якщо немає
s.discard(99) # видаляє 99 якщо є — БЕЗ помилки якщо немає
print(s) # {1, 2, 4}
popped = s.pop() # видаляє і повертає ДОВІЛЬНИЙ елемент
print(popped) # якийсь елемент (порядок невизначений)
s.clear() # видаляє всі елементи
print(s) # set()
```
## Операції над множинами
```python
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
# Об'єднання: всі елементи з обох
print(a | b) # {1, 2, 3, 4, 5, 6}
print(a.union(b)) # те саме
# Перетин: тільки елементи, що є В ОБОХ
print(a & b) # {3, 4}
print(a.intersection(b)) # те саме
# Різниця: є в A, але НЕ в B
print(a - b) # {1, 2}
print(a.difference(b)) # те саме
# Симетрична різниця: є в A або B, але НЕ в обох
print(a ^ b) # {1, 2, 5, 6}
print(a.symmetric_difference(b)) # те саме
```
## Перевірка підмножин і надмножин
```python
small = {1, 2}
big = {1, 2, 3, 4}
print(small.issubset(big)) # True — вся small є у big
print(small <= big) # те саме через оператор
print(big.issuperset(small)) # True — big містить всю small
print(big >= small) # те саме
print(small.isdisjoint({5, 6})) # True — спільних елементів немає
```
## Оновлення на місці
```python
a = {1, 2, 3}
a.update({3, 4, 5}) # додає всі елементи (як |=)
print(a) # {1, 2, 3, 4, 5}
a.intersection_update({2, 3}) # залишає тільки спільні елементи
print(a) # {2, 3}
a.difference_update({3}) # видаляє елементи з аргументу
print(a) # {2}
```
## Методи, що модифікують
| Метод | Що робить |
|---|---|
| `s.add(x)` | Додати `x` до множини |
| `s.remove(x)` | Видалити `x` (кидає `KeyError` якщо немає) |
| `s.discard(x)` | Видалити `x` якщо є, без помилки якщо немає |
| `s.pop()` | Видалити і повернути довільний елемент |
| `s.clear()` | Видалити всі елементи |
| `s.update(other)` | Додати всі елементи з `other` до `s` |
| `s.intersection_update(other)` | Залишити тільки спільні елементи |
| `s.difference_update(other)` | Видалити елементи з `other` |
## Операції над множинами — методи та оператори
| Операція | Метод | Оператор | Результат |
|---|---|---|---|
| Об'єднання | `a.union(b)` | `a | b` | Всі елементи A і B |
| Перетин | `a.intersection(b)` | `a & b` | Тільки є в A і B |
| Різниця | `a.difference(b)` | `a - b` | Є в A, немає в B |
| Симетрична різниця | `a.symmetric_difference(b)` | `a ^ b` | В A або B, але не в обох |
| Підмножина | `a.issubset(b)` | `a <= b` | Вся A є у B |
| Надмножина | `a.issuperset(b)` | `a >= b` | A містить всю B |
| Відсутність перетину | `a.isdisjoint(b)` | — | A і B не мають спільних елементів |
## Оператори vs методи
Оператори (`|`, `&`, `-`, `^`) вимагають, щоб **обидва операнди були множинами**.
Методи (`.union()`, `.intersection()` тощо) приймають **будь-який ітерабельний** об'єкт:
```python
s = {1, 2, 3}
s.union([3, 4, 5]) # OK — список приймається
s | [3, 4, 5] # TypeError — оператор потребує множину
```
## Set comprehension
```python
{вираз for змінна in ітерабельний}
{вираз for змінна in ітерабельний if умова}
```
## Поширені патерни
```python
# Дедублікація зі збереженням порядку
seen = set()
result = [x for x in lst if not (x in seen or seen.add(x))]
# Швидка перевірка членства
VALID = {"admin", "editor", "viewer"}
if role not in VALID:
raise ValueError(f"Unknown role: {role}")
# Спільні елементи кількох множин
common = set.intersection(*list_of_sets)
```
Напишіть функцію `safe_remove(s, value)`, яка видаляє `value` з множини `s` якщо він є, і повертає `True` якщо видалено або `False` якщо не знайдено. Функція ніколи не повинна кидати помилку. Приклад: `s = {1, 2, 3}; safe_remove(s, 2)` → `True`, `s == {1, 3}`; `safe_remove(s, 99)` → `False`.
def safe_remove(s, value):
pass
s = {1, 2, 3}
print(safe_remove(s, 2)) # True (s тепер {1, 3})
print(safe_remove(s, 99)) # False
Рішення
def safe_remove(s, value):
if value in s:
s.discard(value)
return True
return False
s = {1, 2, 3}
print(safe_remove(s, 2)) # True
print(safe_remove(s, 99)) # False
Напишіть функцію `unique_ordered(lst)`, яка видаляє дублікати зі списку зі збереженням порядку першої появи. Приклад: `unique_ordered([3, 1, 4, 1, 5, 9, 2, 6, 5, 3])` → `[3, 1, 4, 5, 9, 2, 6]`. Використовуйте множину для відстеження побачених елементів.
def unique_ordered(lst):
seen = set()
result = []
for item in lst:
if item not in seen:
seen.add(item)
result.append(item)
return result
print(unique_ordered([3, 1, 4, 1, 5, 9, 2, 6, 5, 3]))
# [3, 1, 4, 5, 9, 2, 6]
Напишіть функцію `common(a, b)`, яка повертає множину елементів, що є у обох списках `a` і `b`. Приклад: `common([1, 2, 3, 4], [3, 4, 5, 6])` → `{3, 4}`. Перетворіть на множини і використайте операцію перетину.
Напишіть функцію `exclusive(a, b)`, яка повертає множину елементів, що є рівно в одному з двох списків (але не в обох). Приклад: `exclusive([1, 2, 3], [2, 3, 4])` → `{1, 4}`. Використайте операцію симетричної різниці.
Напишіть функцію `is_subset(small, big)`, яка повертає `True`, якщо кожен елемент `small` також є у `big`. Обидва аргументи можуть бути списками або множинами. Приклад: `is_subset([1, 2], [1, 2, 3, 4])` → `True`, `is_subset([1, 5], [1, 2, 3])` → `False`.
Напишіть функцію `unique_word_count(text)`, яка повертає кількість унікальних слів у рядку (без урахування регістру). Приклад: `unique_word_count("The cat sat on the mat the cat")` → `5` (the, cat, sat, on, mat).
def unique_word_count(text):
pass
print(unique_word_count("The cat sat on the mat the cat"))
# 5 (the, cat, sat, on, mat)
Рішення
def unique_word_count(text):
return len(set(text.lower().split()))
print(unique_word_count("The cat sat on the mat the cat"))
# 5 (the, cat, sat, on, mat)
Напишіть функцію `has_only_valid(s, allowed)`, яка повертає `True`, якщо кожен символ рядка `s` міститься у рядку `allowed`. Приклад: `has_only_valid("hello", "aehllo")` → `True`, `has_only_valid("hello!", "aehllo")` → `False`. Використайте операції над множинами.
Напишіть функцію `vowel_set(text)`, яка повертає множину всіх унікальних голосних (a, e, i, o, u), що зустрічаються у `text` (без урахування регістру). Використайте set comprehension. Приклад: `vowel_set("Hello World")` → `{"e", "o"}`.
Студенти можуть записатись у Клуб A, Клуб B або обидва. З двох множин `club_a` і `club_b` з іменами студентів напишіть функцію `venn(club_a, club_b)`, яка повертає словник з трьома ключами: `"only_a"` (тільки в A), `"only_b"` (тільки в B), `"both"` (в обох). Приклад: `venn({"Alice", "Bob", "Carol"}, {"Bob", "Carol", "David"})` → `{"only_a": {"Alice"}, "only_b": {"David"}, "both": {"Bob", "Carol"}}`.
Напишіть функцію `common_all(*lists)`, яка повертає множину елементів, що є у ВСІХ переданих списках. Приклад: `common_all([1, 2, 3], [2, 3, 4], [2, 3, 5])` → `{2, 3}`. Обробіть випадок коли списків не передано (повернути порожню множину).
def common_all(*lists):
if not lists:
return set()
result = set(lists[0])
for lst in lists[1:]:
result &= set(lst)
return result
print(common_all([1, 2, 3], [2, 3, 4], [2, 3, 5])) # {2, 3}
print(common_all([1, 2], [3, 4])) # set()
print(common_all()) # set()
No split tab
Налаштування cookies
Ми використовуємо необхідні cookies для роботи сайту. З вашого дозволу ми також можемо зберігати налаштування сайту та використовувати аналітичні й рекламні cookies, щоб розуміти використання сайту й підтримувати розвиток проєкту.
* Ви завжди можете змінити свій вибір у налаштуваннях сайту.
Оберіть категорії cookies
Налаштування аналітики
Можна вимкнути аналітику використання платформи. Також можна надіслати в Google Analytics запит на видалення даних про використання цього сайту, пов'язаних із цим браузером.
Навчальний workspace
Навчайтеся, читаючи, запускаючи код і розв'язуючи задачі.
Практикуйте програмування з поясненнями тем, вправами, інструментами browser IDE, перевіркою regex і тренуванням друку коду в одному workspace.
Відкривайте інструменти у вкладках.Вправи, IDE-інструменти й тренажери залишаються доступними як вкладки сайту.
Перемикайтеся без втрати контексту.Переходьте між поясненнями, кодом та утилітами, зберігаючи своє місце.
Використовуйте sidebar як карту.Ліві панелі містять навігацію, налаштування, файли, libraries та керування інструментами.
PythonJavaScriptSQLite
Одна IDE, три практичні режими
Python у браузері.Запускайте невеликі скрипти, пробуйте бібліотеки й тренуйте API-запити без встановлення.
JavaScript для швидких експериментів.Перевіряйте код для браузера й порівнюйте ідеї поруч із навчальними матеріалами.
SQLite для практики з даними.Відкривайте оглядач бази даних, переглядайте таблиці, пишіть запити й вивчайте SQL локально.
ТемаIDE
Працюйте поруч у split tabs
Тримайте інструкції перед очима.Відкрийте вправу або довідкову сторінку поруч з IDE, замість постійних перемикань.
Порівнюйте інструменти під час навчання.Розміщуйте перевірки regex, пояснення та експерименти з кодом поруч, коли це потрібно для задачі.
Закрийте split, коли завершите.Workspace повернеться до однієї сфокусованої вкладки, а відкриті вкладки сайту залишаться доступними.
Тренажер друку коду
Або звичайного тексту
Тренажер розрахований на фізичну клавіатуру.Відкрийте цей розділ на ноутбуці або комп'ютері з широким екраном. На телефоні тренування друку не працюватиме коректно.
Швидкість: 0 зн/хв
0 слів/хв
Найкраща швидкість (60с): 0 зн/хв
0 слів/хв
Помилки: 0
Загальний час: 0.0 с
Щоб тренувати сліпий друк, не підглядайте на фізичну клавіатуру.