Словари¶
dict (от английского «dictionary», словарь) – еще один тип данных в Python. Словари хранят пары ключ : значение . То есть в списках можно достать элемент, если указать его позицию в виде целого числа, а в словарях – тот самый ключ . dict – тип данных, поэтому достать элемент по номеру не получится, но отображение содержимого будет элементов. ключей должна поддерживаться, чтобы всегда можно было быстро найти одно единственно верное значение .
В некоторых языках программирования можно встретить ассоциативные массивы – полную аналогию dict . Также вспомним базы данных, широко использующиеся во всём мире для хранения информации: в таблице можно установить первичный ключ, который уникально идентифицирует запись, как и ключ соответствует значению в словаре. Самый простой пример ключа — порядковый номер объекта!
Создание словаря¶
Использовать словарь стоит, когда нужно сохранять объекты с какими-то ключами и обращаться к объектам по известным ключам. Один из способов определения словаря: указание пар ключ : значение через^запятую внутри фигурных скобок <> . Напоминает set , правда? <> позволяет создать пустой словарь, но не пустое множество.
Например, решили упростить себе жизнь и больше не запоминать дни рождения коллег. Вместо этого, лучше хранить их в одном месте:
В примере dates имеет две пары значений. В первой паре строка «Кунг Фьюри» является ключом, а «1968-09-09» – его значением.
Получение значения по ключу¶
Чтобы получить значение по ключу, необходимо обратиться к переменной, содержащей словарь, и указать ключ в квадратных скобках [] :
Если указать неверный ключ в [] , Python будет ругаться: выбросит ошибку KeyError и перестанет выполнять код. Чуть ниже посмотрим, как можно избежать таких ситуаций.
Изменение и добавление значений¶
Синтаксис изменения значения по ключу и добавления нового ключа со значением одинаковый: в [] нужно указать ключ, поставить = и указать значение, которое теперь будет соответствовать ключу.
Если ключ уже был в словаре, значение по нему изменится на новое, а старое будет удалено. Указание нового ключа со значением добавляет пару в словарь.
Основные методы словаря¶
Проверка вхождения и get() ¶
Помните, ранее говорили, что обращение к несуществующему ключу приводит к ошибке? Пришло время посмотреть пару способов борьбы!
Можно проверить, есть ли интересующий ключ среди множества ключей словаря. Это делается при помощи бинарного оператора in . Слева должен быть указан ключ, справа – переменная со словарем:
В коде проверку можно использовать в условной конструкции if , чтобы принимать решение в зависимости от наличия ключа:
Теперь о методе get() : при помощи его тоже можно получать значения из словаря по ключу. KeyError никогда не появится: если ключа нет, по умолчанию возвращается None :
Вторым аргументом метода get() можно указать значение, которое должно возвращаться вместо None , когда ключ не был найден:
Что такое «длина словаря»?¶
Функция len() для словаря будет возвращать количество пар ключ : значение (их столько же, сколько ключей), которое в нём содержится:
Удаление из словаря¶
Есть несколько способов очистки в словаре: можно убирать по ключу, а можно сразу удалить все!
при помощи инструкции del (от английского «delete») можно удалить пару ключ : значение (удаление ключа эквивалентно удалению пары ключ : значение , так как теряем возможность найти то самое значение ), в общем виде:
Предположим, коллега из самого первого примера уволился и больше нет смысла хранить его день рождения:
pop() — метод, который достает значение, хранящееся по переданному ключу, и сразу удаляет ключ из словаря:
Для метода pop() есть возможность указать значение, которое будет возвращено при обращении к несуществующему ключу. Почти как get() , но всё-таки, без указания этого значения, pop() выбрасывает KeyError .
popitem() имеет схожее название, но не путайте с предыдущим методом: этот на вход не принимает ключ , а возвращает пару ключ : значение , которая была добавлена последней (такое поведение гарантируется с Python ).
clear() позволяет удалить сразу все ключи словаря, то есть полностью его очистить:
Обратите внимание на то, как работают методы pop() , popitem() и clear() : как только вызываются, словарь меняет свой состав (изменения происходят in place, то изменить по месту без копирования).
Обновление и добавление ключей¶
Лицезрели, что значения в словарь можно добавлять или менять, обращаясь по ключу. Python предоставляет возможность не писать кучу присваиваний, а использовать лаконичный метод update() , который на вход может принимать либо другой словарь, либо пары ключ : значение в какой-то последовательности (например, кортежи по два значения в списке: первое – ключ, второе – значение)
А что, если в update() передать пары, ключ которых уже был в словаре? Значения по дублирующимся ключам будут на новые:
Доступ к ключам и значениям¶
В Python можно без проблем извлекать отдельно по ключам или значениям, а также итерироваться по элементам словарей в цикле for . Осталось разобраться, как это работает.
Ключи¶
По умолчанию, в конструкциях вида
переменные цикла (тут – key ) будут принимать значения из множества словаря. Аналогично можно использовать метод keys() (позволяет достать все ключи), который явно говорит, что цикл идет по ключам, например:
Значения¶
При помощи метода values() можно получить все значения, хранящиеся по всем ключам словаря:
Напрямую по значению получить ключ нельзя.
Всё и сразу¶
Существует метод items() , который достает пары ключ : значение в виде последовательности кортежей. Его же часто удобно использовать в циклах, дабы не тащить длинную запись в виде названия словаря и квадратных скобок с ключом при обращении к значению:
Сортировка¶
Функция sorted() доступна и для словарей. По умолчанию ключи словаря поддерживают порядок, в котором были добавлены, но можно отсортировать их в нужном направлении (в зависимости от типа):
Когда в функции передаётся просто название переменной со словарем, работа идет только над множеством ключей.
Можно ли отсортировать словарь по значениям?
Да, можно попробовать самостоятельно разобраться с аргументами функции sorted() .
Что можно хранить¶
Теперь добавим немного технических подробностей: возможно, уже заметили самостоятельно, что dict может принимать в качестве ключа не всякое значение. На самом деле только объекты (можно вызвать функцию hash() и получить значение) могут быть ключами словаря, на значения это ограничение не распространяется. В dict и set значение хеша от объекта используется для поиска внутри структуры.
Ключом словаря нельзя сделать объект типа, например, list , set или сам dict , так как значение их хеша может измениться со временем. Неизменяемый кортеж может быть ключом только если не содержит внутри изменяемые объекты.
Изменяемость и неизменяемость¶
В англоязычной литературе изменяемые типы называют , а неизменяемые – , почитать документацию.
В Python всё есть объект. Когда пользователь присваивает значение переменной, она начинает ассоциироваться с ячейкой памяти, где лежит это значение. Переменная знает адрес, откуда можно получить значение. id() и hex() показывают адрес в памяти компьютера. id() — адрес в десятичном виде, а hex() поможет перевести в шестнадцатеричный.
Как очистить словарь в python
The clear() method removes all items from the dictionary.
Syntax:
Parameters:
Returns:
Parameters:
Examples:
Error:
Python3
Output:
How is it different from assigning <> to a dictionary? Please refer the below code to see the difference. When we assign <> to a dictionary, a new empty dictionary is created and assigned to the reference. But when we do clear on a dictionary reference, the actual dictionary content is removed, so all references referring to the dictionary become empty.