Глава 10 Множини set

⏱️ Час на опанування теми: 25 хвилин

🤷 Для чого ми це вивчаємо:

  • опанувати структуру даних створену для неупорядкованих елементів
  • завершити вивчення структур даних

🔑 Результати навчання:

  • створювати множини set
  • перевіряти чи містяться елементи у множині
  • додавати та видаляти елементи
  • отримувати об’єднання, перетин та різницю двох множин

Множина set – це неупорядкована 🇬🇧 unordered сукупність унікальних об’єктів. Якщо простіше – це як list, але без індексів та тільки з унікальними елементами. Ми також можемо представити собі множини set як словники dict, в яких є тільки ключі 🔑 без значень. Давайте трохи зануримось у тему множин.


10.1 🧳 Створюємо множини

Пам’ятаєте як створити список list? Тоді ви вже майже знаєте як створити множини. Замість квадратних дужок ([ та ]) використайте фігурні ({ та }), і це створить множину. Давайте створимо множину інгредієнтів гамбургера з МакДональдз. Це "bun" (булочка 🥯), "mustard" (гірчиця 🟡), "ketchup" (кетчуп 🔴), "onion" (цибуля 🧅), "pickle" (маринований огірок 🥒) та "beef" (яловичина 🥩):

hamburger = {"bun", "mustard", "ketchup", "onion", "pickle", "beef"}
hamburger
## {'ketchup', 'onion', 'bun', 'beef', 'pickle', 'mustard'}

До речі якби ми два рази зазначили "beef", то словник все одно залишився б таким же. Тому що в словниках можуть бути тільки унікальні елементи, тобто без повторень. Давайте спробуємо:

hamburger = {"bun", "mustard", "ketchup", "onion", "pickle", "beef", "beef"}
hamburger
## {'ketchup', 'onion', 'bun', 'beef', 'pickle', 'mustard'}

До речі, як і ключі 🔑 в словниках dict, елементами множин set можуть бути тільки незмінні об’єкти, такі як int, float, str, bool, tuple тощо.

Давайте ще створимо множину, яка міститиме інгредієнти МакЧікен 🍗. Нам ця множина знадобиться трохи згодом. Назвемо цей об’єкт macchicken:

macchicken = {"bun", "sauce", "salad", "chicken"}
macchicken
## {'sauce', 'salad', 'chicken', 'bun'}

10.2 ➕ Застосовуємо оператори

Оператори дуже важливі для множин set і вони є, так би мовити, основною їх фішкою. Ми почнемо вже з відомого оператора in, а потім перейдемо до математичних операторів.

10.2.1 Перевіряємо наявність об’єкта серед елементів множини

Як і в трьох попередніх типах, множини set мають оператори in та not in, які дозволяють перевірити чи входить елемент в множину. Давайте перевіримо, чи є "cheese" (сир 🧀) серед інгредієнтів гамбургера:

"cheese" in hamburger
## False

Звичайнісінько ж ні (False)! Тоді б це був вже чизбургер 🍔.10

10.2.2 Об’єднуємо множини

Об'єднанням 🇬🇧 union двох множин є множина, елементами якої є елементи з обох множин. Об’єднання здійснюється за допомогою оператора |.

У нашому прикладі з бургерами, це будуть усі інгредієнти які містяться в гамбургері та усі інгредієнти які містяться в МакЧікені:

hamburger | macchicken
## {'ketchup', 'chicken', 'bun', 'beef', 'onion', 'sauce', 'pickle', 'salad', 'mustard'}

10.2.3 Знаходимо перетин множин

Перетин 🇬🇧 intersection двох множин – це ті елементи, які присутні в обох множинах. У Python він реалізований за допомогою оператора &.

Це ті інгредієнти, які містяться і в гамбургері і в МакЧікені (тобто тільки булочка):

hamburger & macchicken
## {'bun'}

10.2.4 Знаходимо різницю між множинами

Різницею 🇬🇧 difference називаються ті елементи, які входять до множини першого операнду, але не входять до множини другого операнда:

Різниця між hamburger та macchicken, це інгредієнти які є в гамбургері, але яких нема у МакЧікен:

hamburger - macchicken
## {'ketchup', 'beef', 'onion', 'pickle', 'mustard'}

10.3 🪛 Застосовуємо корисні методи

Традиційно, ми почнемо з того як додавати та видаляти елементи з множини set.

10.3.1 Додаємо елементи до множини

Для того, щоб додати елемент до множини, ми можемо використати метод .add(). Новий елемент треба буде зазначити між дужками. Додаємо "cheese" до множини hamburger:

hamburger.add("cheese")
hamburger
## {'ketchup', 'onion', 'bun', 'beef', 'pickle', 'cheese', 'mustard'}

10.3.2 Видаляємо елементи із множини

Так, сир не повинен бути у множині hamburger. Ми можемо його видалити двома методами: .remove() чи .pop(). Різниця у тому, що .pop() ще й поверне значення видаленого елементу, після того, як його видалить. Ми ж скористаємось .remove():

hamburger.remove("cheese")
hamburger
## {'ketchup', 'onion', 'bun', 'beef', 'pickle', 'mustard'}

Якщо такого елемента не існує, то методи повернуть помилку:

hamburger.remove("cheese")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'cheese'

10.3.3 Методи, які еквівалентні операторам

Математичні оператори які ми розглянули, тобто об’єднання |, перетин & та різниця -, також реалізовані як методи. Замість того щоб написати a | b, ми можемо записати цей вираз як a.union(b). Цей вираз не змінить a, а поверне нову множину, яка дорівнюватиме a | b. Використовуючи множини hamburger та macchicken, маємо:

hamburger.union(macchicken)
## {'ketchup', 'chicken', 'bun', 'beef', 'onion', 'sauce', 'pickle', 'salad', 'mustard'}

Нижче ми покажемо таблицю відповідності методів до операторів:

Оператор Метод
a | b a.union(b)
a & b a.intersection(b)
a - b a.difference(b)

Йой, ти взагалі розумієш, що зараз сталося? Ми не просто навчились тільки що створювати множини set та працювати з їх елементами. Ні! Опанувавши множини set, ми звершили величезний блок зі структур даних 😎 Це велика перемога 👏, і тепер головне не зупинятись!


🤸 Вправи
1. Як створити множину?
2. Перетягніть символи коду у правильному порядку, щоб знайти перетин множин A та B:
B
A
&
3. Напищіть код, що додає елемет 12 до множини grades:
4. Перетягніть структури даних до правильної корзини:
list
tuple
dict
set
Можна змінити
Не можна змінити
5. Оберіть правильні твердження щодо множин set:
6. Щоб створити множину потрібно використовувати:
7. Як правильно створити множину, щоб отримати такий результат?
## {'Dnipro', 'Kharkiv', 'Kyiv', 'Lviv', 'Odesa'}
Оберіть правильну відповідь:
8. 'Lviv' in uacities перевірить, чи є Львів серед українських міст:

  1. До речі, автор цієї книги є запеклим шанувальником саме чизбургерів 🍔. Він пам’ятає часи коли він навчався в школі, і чизбургери 🍔 в МакДональдз коштували 2.50 ₴.↩︎