## ++Тема 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 ``` --- ## Спасибо за внимание! ![](https://i.imgur.com/gKDsna4.png) (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}]"}
    312 views