С данными намного легче работать, если эти данные упорядочены нужным вам образом и располагаются в каком-то одном месте с легким доступом. Словари (dictionary) – тип данных, который предлагает размещать все данные в виде пары «ключ: значение», хранить их в переменной словаря и выдавать доступ к данным по ключу, то есть по обращению к «имени» записи. Словари – один из самых удобных способов организации данных, и вам лучше заранее знать, как они работают – материал ниже как раз про все это расскажет.
Вероятно, объяснения про ключи-значения вы уже слышали, поэтому мы зайдем с другой стороны. Вспомните про списки – эта структура данных тоже позволяет хранить значение. Списки работают крайне просто: у вас есть пронумерованные ячейки, в которые можно класть данные. Ячейки пронумерованы (проиндексированы) с нуля – сначала данные кладутся в ячейку «0», следующие помещаются в ячейку «1» и так далее. Для того, чтобы получить доступ к данным в ячейке «1», вам нужно к ней обратиться – написать что-то вроде «print(test_list[1])». Получается, что «1» – это ключ, по которому мы получаем доступ к данным в ячейке, если расписать список «[‘a’, ‘b’, ‘c’]» с таким подходом – мы получим [0: ‘a’, 1: ‘b’, 2: ‘c’]. Заменяем квадратные скобки на фигурные – и получаем словарь, в котором ключами являются числа от 0 (список – это частный случай словаря). От списка словарь отличается тем, что нам не обязательно использовать в качестве ключей числа – мы можем, например, использовать строки: {‘first_letter’: ‘a’, ‘second_letter’: ‘b’, ‘third_letter’: ‘c’}.
Почему словари так популярны? По той же причине, по которой популярны все типы данных, похожие на массивы – в них удобно хранить факты. Пол, возраст, рос, вес, имя и пароль пользователя – это факты, которые существуют в единственном числе и могут быть названы удобными ярлыками, поэтому вполне логично создать структуру, в которой все эти факты будут храниться – и внутренняя иерархия будет одинаковой для всех пользователей. К слову, самый популярный на текущий момент способ передачи массивов данных через интернет – это JSON, который, по большому счету, представляет собой один большой словарь.
Какие особенности есть у словарей? Из того, что вам нужно знать в начале обучения: ключи словарей в Python хэшируются, то есть ключ по специальному алгоритму преобразуется в набор символов, который легко проассоциировать с индексом массива («под» словарем в Python лежит массив). Хэширование существенно увеличивает быстродействие словарей, но есть 2 проблемы:
С первой проблемой разработчики Python справились – начиная с версии 3.6, Python гарантирует сохранение порядка помещенных в словарь элементов (хотя писать код, зависимый от этого порядка – плохая практика, таких алгоритмов следует избегать). А вот вторая проблема осталась – алгоритму хэширования нужно быть уверенным, что значение ключа, помещенного в словарь, не может измениться. Поэтому ключами в словаре могут быть только неизменяемые (immutable) типы: числа, boolean, строки, класс «byte» (при этом класс «bytearray» не подходит – он mutable), кортежи, frozenset. А вот в качестве значений могут использоваться как изменяемые, так и неизменяемые типы.
Есть 4 способа создания словарей:
Все основные методы словарей в Python можно разбить на 3 условные операции: «получить», «изменить», «удалить».
Способы получения данных из словаря:
Отдельно стоит упомянуть метод .copy() – он позволяет получить не просто значение, а копию всего словаря. Копия будет неглубокой – это значит, что если в значениях оригинала были ссылки на объекты, копия получит эти же ссылки, и при изменении данных по ссылке у оригинала вы измените данные для копии (и наоборот).
Что касается изменения данных в словаре – у вас есть 2 варианта:
Наконец, удалить можно:
В них крайне удобно хранить четкую информацию: словарь предоставляет нам ячейку, в которой эта информация будет храниться, и описательное название, по которому эту информацию можно легко достать из ячейки. Кроме того, словарь – это структура данных, поэтому с ним можно делать все то же, чего ожидают от структур данных – перебор элементов, например.
Вообще что угодно – от чисел до других словарей. Ограничения есть только у ключей – ключи должны быть неизменяемого типа.