Перейти до основного вмісту
Модуль 3 · Урок 4 із 412/36 у курсі~10 min
Модульні уроки (4/4)

Набори

Набір — це набір унікальних невпорядкованих елементів. Три наддержави:

  1. Автоматична дедуплікація: додавання того самого елемента двічі не має ефекту.
  2. O(1) тест членства: x in s надзвичайно швидкий навіть з мільйонами елементів (на основі хешу, як і dicts).
  3. Операції з множинами: об’єднання, перетин, різниця, симетрична різниця.

Створення набору

Python
vuoto = set()           # ATTENZIONE: {} è un dict vuoto, non un set!
numeri = {1, 2, 3}
da_lista = set([1, 1, 2, 3, 3, 3])   # {1, 2, 3}

Лише дужки {} створюють порожній словник, а не набір: для порожнього набору вам потрібен set().

Модифікація набору

Python
s = {1, 2, 3}
s.add(4)         # {1, 2, 3, 4}
s.add(1)         # nessun effetto (già presente)
s.discard(99)    # rimuove se presente, silenzioso altrimenti
s.remove(2)      # rimuove o solleva KeyError

Операції з безліччю

Python
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}

a | b    # {1, 2, 3, 4, 5, 6}     unione
a & b    # {3, 4}                  intersezione
a - b    # {1, 2}                  differenza (in a ma non in b)
a ^ b    # {1, 2, 5, 6}            differenza simmetrica (xor)

Існують також форми методів (a.union(b), a.intersection(b), …), які в додавання приймає будь-які повторювані, а не лише набори.

Тест на членство

Python
parole = {"ciao", "mondo", "python"}
"ciao" in parole       # True   O(1)
"java" not in parole   # True

Для порівняння: пошук за допомогою in всередині list становить O(n) і довго списки це набагато повільніше.

Frozen set: незмінна версія

frozenset({1, 2, 3}) — хешована версія: це може бути ключ dict або елемент іншої множини.

Набір операцій і продуктивність

Набори реалізовано як хеш-таблиці, що робить тестування членства (x in my_set) надзвичайно швидким: воно виконується за постійний час O(1), на відміну від списків, де пошук займає лінійний час O(n). Крім того, вони підтримують такі алгебраїчні операції, як об’єднання (|), перетин (&) і різниця (-).

Спробуйте

вправи#python.m3.l4.e1
Спроби: 0Завантаження…

За наявності списку `nums = [1, 2, 2, 3, 3, 3, 4]` створіть `unique_items` з унікальними значеннями (у будь-якому порядку), а потім обчисліть `count` як len(unique_items). Оцініть `count`.

Завантаження редактора…
Показати підказку

set(nums) видаляє дублікати.

Рішення доступне після 3 спроб

Повторна вправа

вправи#python.m3.l4.e2
Спроби: 0Завантаження…

Якщо задано `a = {1, 2, 3, 4}` і `b = {3, 4, 5, 6}`, обчисліть перетин у `common_items`, а різницю a-b у `only_a`. Оцініть кортеж `(common_items, only_a)`.

Завантаження редактора…
Показати підказку

& перетин, - різниця.

Рішення доступне після 3 спроб

Додатковий виклик

вправи#python.m3.l4.e3
Спроби: 0Завантаження…

Given two sets `set_a = {1, 2, 3}` and `set_b = {2, 3, 4}`, calculate the mathematical intersection of the two sets (their common elements). Store the resulting set in `common_elements` and evaluate it.

Завантаження редактора…
Показати підказку

Ви можете використовувати оператор & або метод set_a.intersection(set_b).

Рішення доступне після 3 спроб