## ++Тема 10++<br>Ассоциативные структуры данных
(c) Яценко Р.Н., 2019-2020
---
## 1. Назначение и создание словарей
----
### Определение словаря
- Структура данных, позволяющая идентифицировать ее элементы не по числовому индексу, а по произвольному, называется _словарем_ или _ассоциативным массивом_
- Соответствующая структура данных в языке Python называется `dict`
----
### Пример 1. Страны и столицы
```python=
# Создадим пустой словать Capitals и заполним его значениями
Capitals = dict()
Capitals['Ukraine'] = 'Kyiv'
Capitals['Russia'] = 'Moscow'
Capitals['USA'] = 'Washington'
# Поиск столиц для списка
Countries = ['Russia', 'France', 'USA', 'Ukraine']
for country in Countries:
# Для каждой страны из списка проверим,
# есть ли она в словаре Capitals
if country in Capitals:
print('Столица страны ' + \
country + ': ' + Capitals[country])
else:
print('В базе нет страны c названием ' + country)
```
----
<iframe frameborder="0" src="http://pythontutor.com/iframe-embed.html#code=%23%20%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%B4%D0%B8%D0%BC%20%D0%BF%D1%83%D1%81%D1%82%D0%BE%D0%B9%20%D1%81%D0%BB%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20Capitals%20%D0%B8%20%D0%B7%D0%B0%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D0%BC%20%D0%B5%D0%B3%D0%BE%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8%0ACapitals%20%3D%20dict%28%29%0ACapitals%5B'Ukraine'%5D%20%3D%20'Kyiv'%0ACapitals%5B'Russia'%5D%20%3D%20'Moscow'%0ACapitals%5B'USA'%5D%20%3D%20'Washington'%0A%23%20%D0%9F%D0%BE%D0%B8%D1%81%D0%BA%20%D1%81%D1%82%D0%BE%D0%BB%D0%B8%D1%86%20%D0%B4%D0%BB%D1%8F%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%0ACountries%20%3D%20%5B'Russia',%20'France',%20'USA',%20'Ukraine'%5D%0Afor%20country%20in%20Countries%3A%0A%20%20%20%20%23%20%D0%94%D0%BB%D1%8F%20%D0%BA%D0%B0%D0%B6%D0%B4%D0%BE%D0%B9%20%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%8B%20%D0%B8%D0%B7%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%20%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D0%BC,%20%0A%20%20%20%20%23%20%D0%B5%D1%81%D1%82%D1%8C%20%D0%BB%D0%B8%20%D0%BE%D0%BD%D0%B0%20%D0%B2%20%D1%81%D0%BB%D0%BE%D0%B2%D0%B0%D1%80%D0%B5%20Capitals%0A%20%20%20%20if%20country%20in%20Capitals%3A%0A%20%20%20%20%20%20%20%20print%28'%D0%A1%D1%82%D0%BE%D0%BB%D0%B8%D1%86%D0%B0%20%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%8B%20'%20%2B%20%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20country%20%2B%20'%3A%20'%20%2B%20Capitals%5Bcountry%5D%29%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20print%28'%D0%92%20%D0%B1%D0%B0%D0%B7%D0%B5%20%D0%BD%D0%B5%D1%82%20%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%8B%20c%20%D0%BD%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC%20'%20%2B%20country%29&codeDivHeight=400&codeDivWidth=350&cumulative=false&curInstr=0&heapPrimitives=nevernest&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false" style="width: 100%; height: 50vh; transform: scale(1.1);"> </iframe>
----
### Элементы словаря
- Каждый элемент словаря состоит из двух объектов:
- _ключ_
- _значение_
- Ключ идентифицирует элемент словаря, значение является данными, которые соответствуют данному ключу. Значения ключей -- уникальны, двух одинаковых ключей в словаре быть не может
----
### Примеры
- *Бумажные словари* (толковые, орфографические, лингвистические). В них ключом является слово-заголовок статьи, а значением -- сама статья. Для того, чтобы получить доступ к статье, необходимо указать слово-ключ
- *Телефонный справочник*. В нем ключом является имя, а значением -- номер телефона
----
### Динамичность словаря
- Особенностью ассоциативного массива является его *динамичность* -- в него можно добавлять новые элементы с произвольными ключами и удалять уже существующие элементы
- При этом размер используемой памяти пропорционален размеру ассоциативного массива. Доступ к элементам ассоциативного массива выполняется хоть и медленнее, чем к обычным массивам, но в целом довольно быстро
----
### Когда нужно использовать
1. Подсчет числа каких-то объектов. В этом случае нужно завести словарь, в котором ключами являются объекты, а значениями -- их количество
2. Хранение каких-либо данных, связанных с объектом. Ключи -- объекты, значения -- связанные с ними данные
```python
Num['January'] = 31
Num['February'] = 28
...
```
----
3. Установка соответствия между объектами (например, “родитель--потомок”). Ключ -- объект, значение -- соответствующий ему объект
4. Если нужен обычный массив, но масимальное значение индекса элемента очень велико, и при этом будут использоваться не все возможные индексы (так называемый *“разреженный массив”*), то можно использовать ассоциативный массив для экономии памяти
----
### Пример 2. Создание словаря
Пустой словарь можно создать при помощи функции `dict()` или пустой пары фигурных скобок `{}`
```python=
Capitals = {'Ukraine': 'Kyiv', 'Russia': 'Moscow',
'USA': 'Washington'}
Capitals = dict(Ukraine = 'Kyiv', Russia = 'Moscow',
USA = 'Washington')
Capitals = dict([("Ukraine", "Kyiv"), ("Russia", "Moscow"),
("USA", "Washington")])
Capitals = dict(zip(["Ukraine", "Russia", "USA"],
["Kyiv", "Moscow", "Washington"]))
print(Capitals)
```
```
{'Ukraine': 'Kyiv', 'Russia': 'Moscow', 'USA': 'Washington'}
```
---
## 2. Работа с элементами словаря
----
### Получение значения элемента
- Основная операция: получение значения элемента по ключу, записывается так же, как и для списков:
`A[key]`
- Если элемента с заданным ключом нет в словаре, то возникает ошибка `KeyError`
----
### Метод get
`A.get(key)`
- Если элемента с ключом `key` нет в словаре, то возвращается значение `None`
- В форме записи с двумя аргументами `A.get(key, val)` метод возвращает значение `val`, если элемент с ключом `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, val in A.items():
print(key, val)
```
```
a 0
b 1
c 2
d 3
e 4
f 5
```
---
## Спасибо за внимание!

(c) Яценко Р.Н., 2019-2020
{"metaMigratedAt":"2023-06-15T16:28:01.611Z","metaMigratedFrom":"YAML","title":"Тема 10. Ассоциативные структуры данных","breaks":false,"slideOptions":"{\"allottedMinutes\":80,\"slideNumber\":\"c\",\"theme\":\"beige\",\"transition\":\"slide\",\"spotlight\":{\"enabled\":true}}","contributors":"[{\"id\":\"93a8c43f-1b5b-4461-9101-89b183ccbc1c\",\"add\":7435,\"del\":11}]"}