logo
Ещё

Словари в Python

С данными намного легче работать, если эти данные упорядочены нужным вам образом и располагаются в каком-то одном месте с легким доступом. Словари (dictionary) – тип данных, который предлагает размещать все данные в виде пары «ключ: значение», хранить их в переменной словаря и выдавать доступ к данным по ключу, то есть по обращению к «имени» записи. Словари – один из самых удобных способов организации данных, и вам лучше заранее знать, как они работают – материал ниже как раз про все это расскажет.

Что такое словари в Python

Вероятно, объяснения про ключи-значения вы уже слышали, поэтому мы зайдем с другой стороны. Вспомните про списки – эта структура данных тоже позволяет хранить значение. Списки работают крайне просто: у вас есть пронумерованные ячейки, в которые можно класть данные. Ячейки пронумерованы (проиндексированы) с нуля – сначала данные кладутся в ячейку «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 проблемы:

  1. Хэш-таблицы (таблицы закодированных ключей) обычно не позволяют сохранять порядок помещенных в словарь элементов.
  2. Если значение ключа изменится без ведома алгоритма, производящего хэширование, весь словарь сломается.

С первой проблемой разработчики Python справились – начиная с версии 3.6, Python гарантирует сохранение порядка помещенных в словарь элементов (хотя писать код, зависимый от этого порядка – плохая практика, таких алгоритмов следует избегать). А вот вторая проблема осталась – алгоритму хэширования нужно быть уверенным, что значение ключа, помещенного в словарь, не может измениться. Поэтому ключами в словаре могут быть только неизменяемые (immutable) типы: числа, boolean, строки, класс «byte» (при этом класс «bytearray» не подходит – он mutable), кортежи, frozenset. А вот в качестве значений могут использоваться как изменяемые, так и неизменяемые типы.

Создание словарей

Есть 4 способа создания словарей:

  1. Вручную описываем словарь, который хотим создать. Словарь нужно заключить в фигурные скобки, внутри должны лежать пары «ключ: значение», разделенные запятыми.

  2. Пользуемся встроенной функцией dict. Ей «на вход» нужно подать список или кортеж, внутри которого должны лежать списки/кортежи с двумя значениями – первое значение будет использовано как key, второе будет value.

  3. Пользуемся dict.fromkeys(). Иногда бывает удобно создать в словаре много записей с разными ключами, но одним и тем же значением – для этого у dict есть встроенный метод .fromkeys(), который принимает 2 аргумента – первым является список ключей, вторым является value, которое будет присвоено всем этим ключам. Если опустить второй аргумент – вместо значений будет None.

  4. Пользуемся генератором. Для многих структур данных в Python предусмотрены генераторы – специальный синтаксис, который позволяет быстро создать экземпляр структуры. Для словарей генератор имеет синтаксис вида: «{ключ: значение for переменная in последовательность}».

Операции для работы со словарями и их методы

Все основные методы словарей в Python можно разбить на 3 условные операции: «получить», «изменить», «удалить».

Способы получения данных из словаря:

  • Обратиться по ключу. Просто указываете имя словаря и ключ так же, как указываете индекс для списков: print(test_dict([‘sravni’])).
  • Использовать .get(). Указываем ключ, получаем значение. Если ключа нет – метод возвращает None. Можно вторым необязательным аргументом указать default value – если метод не найдет ключ, он вернет это default value, а не None.
  • Получить все ключи одним из 3 способов. Первый способ – через метод .keys(); второй способ – просто указанием имени словаря в цикле for; третий способ – через распаковку словаря (*test_dict).
  • Получить все значения. Делается через метод .values().
  • Получить и ключи, и значения списком кортежей. Делается через метод .items().
  • Получить значение и удалить его ключ. Делается через метод .pop() – указываете ключ, и метод возвращает его значение, после чего удаляет из словаря эту пару.
  • Получить и удалить последнее внесенное значение. Делается через метод .popitem(), метод возвращает кортеж из ключа и значения.
  • Взять элемент, а если его нет – добавить. Делается через .setdefault(), функция принимает 2 аргумента (ключ и значение) и работает следующим образом: если в словаре есть ключ, то функция возвращает его значение; если в словаре ключа не оказалось, то функция добавляет новую пару «ключ: значение» из переданных аргументов.

Отдельно стоит упомянуть метод .copy() – он позволяет получить не просто значение, а копию всего словаря. Копия будет неглубокой – это значит, что если в значениях оригинала были ссылки на объекты, копия получит эти же ссылки, и при изменении данных по ссылке у оригинала вы измените данные для копии (и наоборот).

Что касается изменения данных в словаре – у вас есть 2 варианта:

  • Изменить значение по ключу. Работает так же, как у списков, только вместо индекса вы указываете ключ: test_dict[‘sravni’] = 10.
  • Добавить сразу несколько элементов. Делается через функцию .update(), в качестве аргумента функция принимает либо словарь, либо список/кортеж, в котором хранятся пары «ключ: значение» (обычно они хранятся в кортежах).

Наконец, удалить можно:

  • Один элемент. Синтаксис: del test_dict[‘a’].
  • Все элементы. Делается через метод .clear().

FAQ – если нет времени читать

Зачем нужны словари?

В них крайне удобно хранить четкую информацию: словарь предоставляет нам ячейку, в которой эта информация будет храниться, и описательное название, по которому эту информацию можно легко достать из ячейки. Кроме того, словарь – это структура данных, поэтому с ним можно делать все то же, чего ожидают от структур данных – перебор элементов, например.

Что можно хранить в словарях?

Вообще что угодно – от чисел до других словарей. Ограничения есть только у ключей – ключи должны быть неизменяемого типа.

Где почитать про словари?

Официальная документация.