---
title: Тема 13. Словники та множини
tags: Python
slideOptions:
allottedMinutes: 80
theme: beige
slideNumber: c
spotlight:
enabled: true
---
## ++Тема 13++<br>Словники та множини
(c) Яценко Р.М., 2019-2023
[Навчальний центр комп'ютерних технологій "Кит"](http://kit.kh.ua/)
<img src="https://i.imgur.com/Kh901c1.png" style="width: 150px; position: fixed; top: 10px; right: 10px; border: 0;">
---
## 1. Призначення та створення словників
----
### Визначення словника
- Структура даних, що дозволяє ідентифікувати її елементи не за числовим індексом, а за довільним, називається _словником_ або _асоціативним масивом_
- Відповідна структура даних у мові Python називається `dict`
----
### Приклад 1. Країни та столиці
```python=
# Створимо порожній словник Capitals та заповнимо його значеннями
Capitals = {}
Capitals['Ukraine'] = 'Kyiv'
Capitals['Poland'] = 'Warsaw'
Capitals['USA'] = 'Washington'
# Пошук столиць для списку
Countries = ['Poland', 'France', 'USA', 'Ukraine']
for country in Countries:
# Для кожної країни зі списку перевіримо, чи є вона у Capitals
if country in Capitals:
print('Столиця країни ' + \
country + ': ' + Capitals[country])
else:
print('У базі немає країни з назвою ' + country)
```
----
```
Столиця країни Poland: Warsaw
У базі немає країни з назвою France
Столиця країни USA: Washington
Столиця країни Ukraine: Kyiv
```
----
### Елементи словника
- Отже, кожен елемент словника складається з двох об'єктів:
- _ключ_
- _значення_
- Ключ ідентифікує елемент словника, значення є даними, які відповідають цьому ключу. Ключі -- унікальні, двох однакових ключів у словнику бути не може
----
### Приклади
- *Вікіпедія*. Ключем словника є слово-заголовок статті, а значенням — сама стаття. Щоб отримати доступ до статті, необхідно вказати слово-ключ
- *Контакти в телефоні*. У цьому словнику ключем є ім'я, а значення номер телефону
----
### Динамічність словника
- Особливістю словника є його *динамічність* -- до нього можна додавати нові елементи з довільними ключами і видаляти вже існуючі елементи
- При цьому розмір пам'яті, що використовується, пропорційний розміру словника. Доступ до елементів словника виконується хоч і повільніше, ніж до звичайних списків, але загалом досить швидко
----
### Коли потрібно використовувати
1. Підрахунок кількості якихось об'єктів. І тут потрібно завести словник, у якому ключами є об'єкти, а значеннями -- їх кількість
2. Зберігання будь-яких даних, пов'язаних з об'єктом. Ключі -- об'єкти, значення -- пов'язані з ними дані
```python
Days['January'] = 31
Days['February'] = 28
...
```
----
3. Встановлення відповідності між об'єктами (наприклад, “батько-нащадок”). Ключ - об'єкт, значення - відповідний йому об'єкт
4. Якщо потрібен звичайний масив, але масимальне значення індексу елемента дуже велике, і при цьому будуть використовуватися не всі можливі індекси (так званий "розріджений масив"), то можна використовувати словник (асоціативний масив) для економії пам'яті
----
### Приклад 2. Створення словника
Порожній словник можна створити за допомогою функції `dict()` або порожньої пари фігурних дужок `{}`
```python=
Capitals = {'Ukraine': 'Kyiv', 'Poland': 'Warsaw',
'USA': 'Washington'}
Capitals = dict(Ukraine = 'Kyiv', Poland = 'Warsaw',
USA = 'Washington')
Capitals = dict([("Ukraine", "Kyiv"), ("Poland", "Warsaw"),
("USA", "Washington")])
Capitals = dict(zip(["Ukraine", "Poland", "USA"],
["Kyiv", "Warsaw", "Washington"]))
print(Capitals)
```
```
{'Ukraine': 'Kyiv', 'Poland': 'Warsaw', 'USA': 'Washington'}
```
---
## 2. Робота з елементами словника
----
### Отримання значення елемента
- Основна операція отримання значення елемента по ключу записується так само, як і для списків:
`A[key]`
- Якщо елемента із заданим ключем немає у словнику, виникає помилка `KeyError`
----
### Метод get
`A.get(key)`
- Якщо елемента з ключем `key` немає у словнику, то повертається значення `None`
- У формі запису з двома аргументами `A.get(key, value)` метод повертає значення `value`, якщо елемент із ключем `key` відсутній у словнику
----
### Перевірка приналежності
Перевірити приналежність елемента словнику можна операціями `in` та `not in`
```python
if country in Capitals:
print('Столиця країни ' + country + ': ' + Capitals[country])
```
----
### Додавання та видалення елемента
- Для додавання нового елемента до словника потрібно просто надати йому якесь значення:
`A[key] = value`
- Для видалення елемента зі словника можна використати операцію `del A[key]`
(виникне помилка `KeyError`, якщо такого ключа у словнику немає)
----
### Приклад 3. Безпечний спосіб видалення
Попередньо перевіряємо наявність елемента за допомогою `in`
```python=
A = {'ab' : 'ba', 'aa' : 'aa', 'bb' : 'bb', 'ba' : 'ab'}
key = 'ac'
if key in A:
del A[key]
```
----
### Приклад 4. Перебір елементів словника
Можна легко організувати перебір ключів всіх елементів у словнику
```python=
A = dict(zip('abcdef', list(range(6))))
for key in A:
print(key, A[key])
```
```
a 0
b 1
c 2
d 3
e 4
f 5
```
----
### Методи представлення елементів словника
- `A.keys()` повертає список ключів усіх елементів
- `A.values()` повертає список усіх значень елементів
- `A.items()` повертає список усіх пар (кортежів) із ключів та значень
----
### Приклад 5. Перебір елементів словника-2
За допомогою методу словника `items`
```python=
A = dict(zip('abcdef', list(range(6))))
for key, value in A.items():
print(key, value)
```
```
a 0
b 1
c 2
d 3
e 4
f 5
```
---
## 3. Множини
<!-- [Множества](http://pythontutor.ru/lessons/sets/) -->
----
### Множини в Python
- Множини у мові Python (`set`) можуть складатися тільки з різних елементів, порядок елементів у множині невизначений
- Виконувати операції можна як над множинами, так і з окремими елементами
----
### Порядок зберігання елементів
- На відміну від списків, де елементи зберігаються у вигляді послідовного списку, у множинах порядок зберігання елементів невизначений (більше того, елементи множини зберігаються не поспіль, як у списку, а за допомогою хитрих алгоритмів)
- Це дозволяє виконувати операції типу "перевірити приналежність елемента множині" швидше, ніж просто перебираючи всі елементи множини
----
### Елементи множин
- Елементами множини може бути будь-який незмінний тип даних:
- числа
- рядки
- кортежі (незмінні списки)
- Типи даних, що змінюються, не можуть бути елементами множини (список або інша множина)
----
### Створення множин
- Множина задається перерахуванням всіх її елементів у фігурних дужках
- Винятком є порожня множина, яку можна створити за допомогою функції set()
- Якщо функції set передати як параметр список, рядок чи кортеж, вона поверне множину, що складається з елементів цієї послідовності
----
### Приклад 6
```python=1
a = {1, 2, 3}
print(a)
b = set('qwerty')
print(b)
```
```
{1, 2, 3}
{'e', 'q', 'r', 't', 'w', 'y'}
```
----
### Приклад 7
Кожен елемент може входити до множини лише один раз, порядок надання елементів неважливий
```python=1
a = {1, 2, 3}
b = {3, 2, 3, 1}
print(a == b)
# виведе True, тому що a і b — рівні (однакові) множини
print(set('Hello'))
# виведе {'H', 'e', 'l', 'o'}
```
----
### Робота з елементами множини
- Дізнатися кількість елементів у множинах можна за допомогою функції len
- Перебрати всі елементи множини (у невизначеному порядку!) можна за допомогою циклу for:
```python=1
primes = {2, 3, 5, 7, 11}
for number in primes:
print(number)
```
----
### Перевірка приналежності
- Перевірити, чи належить елемент множині можна за допомогою операції `in`, що повертає значення `True` або `False`
- Аналогічно є протилежна операція `not in`
```python=1
a = {1, 2, 3}
print(1 in a, 4 not in a)
# True, True
```
----
### Додавання та видалення елементів
- Для додавання елемента -- метод `add`
- Для видалення елементів є два методи: `discard` та `remove`. Якщо елемент, що видаляється, відсутній - `discard` не робить нічого, а `remove` генерує помилку
```python=1
a = {1, 2, 3}
a.add(4)
a.remove(3)
print(a) # {1, 2, 4}
```
- Метод `pop` видаляє один випадковий елемент та повертає його значення
----
### Операції з множинами
Операція|Опис
--|--
`A \| B` | Повертає множину, що є об'єднанням множин `A` і `B`
`A & B` | Повертає множину, що є перетином множин `A` і `B`
`A - B` | Повертає різницю множин `A` і `B` (елементи, що входять в `A`, але не входять в `B`)
----
### Операції порівняння
Операція|Опис
--|--
`A == B`<br>`(A != B)` | Повертає `True`, якщо множини `A` та `B` містять однакові елементи
`A <= B` | Повертає `True`, якщо всі елементи множини `A` входять до `B`
`A < B` | Те саме, що й `A <= B and A != B`
---
## Домашнє завдання
Набрати та запустити на виконання усі приклади програм з лекції

(c) Яценко Р.М., [НЦКТ "Кит"](http://kit.kh.ua/), 2019-2023