Словари в Python
В этом руководстве вы узнаете всё о словарях в Python: как их создавать, как добавлять, удалять, как получать из них элементы, а еще познакомитесь со встроенными методами словарей.
Словарь — это неупорядоченный набор элементов. Элемент словаря представляет собой пару ключ: значение . Словари оптимизированы для получения значений по заданному ключу.
Как создать словарь
Чтобы создать словарь в Python, необходимо прописать элементы внутри фигурных скобок <> и разделить их запятыми.
В элементе содержится ключ и соответствующее значение, они записываются так: (ключ: значение) .
В словарях значения могут повторяться и быть любого типа. Ключи же повторяться не могут и должны быть неизменяемым типом (строками, числовыми типами и кортежами с неизменяемыми элементами).
Как вы увидели выше, мы можем создать словарь с помощью встроенной функции dict() .
Как получить элементы из словаря
В отличие от других типов данных, где для доступа к элементам используется индексация, в словаре используются ключи. Они используются внутри квадратных скобок или в качестве аргумента метода get() .
При использовании квадратных скобок и отсутствии элемента в словаре вызывается ошибка KeyError. При использовании метода get() и отсутствии элемента возвращается None .
Вывод:
Как изменить или добавить элементы в словаре
Словари — изменяемый тип данных. Это значит, что в него можно добавить новые элементы или изменить уже существующие с помощью оператора присваивания.
Если добавляемый ключ есть в словаре, значение элемента изменяется. Если же такого ключа еще нет, то в словарь добавляется новая пара (ключ: значение) .
Вывод:
Как удалить элементы из словаря
Удалить нужный элемент словаря по ключу можно с помощью метода pop() . Этот метод удаляет элемент с соответствующим ключом и возвращает значение.
Удалить произвольную пару (ключ, значение) можно с помощью метода popitem() . Очистить весь словарь за один раз можно с помощью метода clear() .
Также можно использовать ключевое слово del для удаления отдельных элементов или же всего словаря.
Вывод:
Методы словарей
В таблице ниже указаны доступные методы словарей. Некоторые из них мы уже использовали в примерах выше.
Метод
Что делает
Удаляет все элементы из словаря
Возвращает неглубокую копию словаря
Возвращает словарь с ключами из seq и значениями, равными v (по умолчанию None )
Возвращает значение ключа key . Если key не существует, возвращает d (по умолчанию None )
Возвращает новый объект элементов словаря в формате (ключ, значение)
Возвращает новый объект с ключами словаря
Удаляет элемент с ключом key и возвращает его значение или d , если key не найден. Если d не было обозначено и key не найден, вызывает ошибку KeyError.
Удаляет и возвращает произвольную пару (ключ, значение) . Вызывае ошибку KeyError, если словарь пустой.
Если ключ key есть в словаре, возвращает соответствующее ему значение. Если нет, добавляет в словарь элемент с ключом key и значением d и возвращает d (по умолчанию None )
Обновляет словарь имеющимися парами ключ/значение из other , перезаписывая существующие ключи
Возвращает новый объект со значениями словаря
Вывод:
Представление словарей
Представление словарей — элегантный и лаконичный способ создать новый словарь из итерируемого объекта.
Представление словарей состоит из выражения ключ: значение , за которым следует for , и всё это — внутри фигурных скобок <> .
Создадим словарь с парами чисел и их квадратов в качестве элементов:
Вывод:
То же самое можно сделать иначе, но так будет длинее:
Вывод:
В представлении словарей выражений for и if опционально может быть больше.
Необязательное выражение if поможет отфильтровать элементы для создания нового словаря.
Давайте создадим словарь только с квадратами только нечетных чисел:
Вывод:
Другие операции со словарями
Проверка на вхождение в словарь
Проверить, есть ли ключ в словаре, можно с помощью ключевого слова in . Отметим, что проверку на вхождение можно провести только над ключами, не над значениями
Вывод:
Итерирование по словарю
Мы можем пройтись по всем ключам словаря, используя цикл for .
Вывод:
Встроенные функции для словарей
Встроенные функции all() , any() , len() , cmp() , sorted() и т. д. часто используются со словарями для разных задач.
Функция
Описание
Возвращает True , если все ключи словаря = True (или если словарь пуст)
Возвращает True , если хотя бы один ключ словаря = True . Если словарь пуст, возвращает False .
Словарь Python – полное руководство
Словарь Python используется для хранения данных в формате пары ключ-значение.
Что такое словарь в Python?
Словарь в Python – это тип данных, который может имитировать реальную организацию данных, в которой существует определенное значение для определенного ключа. Это изменяемая структура данных. Словарь определяется в элементах ключи и значения:
- Ключи должны быть единым элементом.
- Значение может быть любого типа, например, список, кортеж, целое число и т. д.
Другими словами, мы можем сказать, что словарь – это набор пар ключ-значение, где значением может быть любой объект Python. Напротив, ключи – это неизменяемый объект Python, то есть числа, строка или кортеж.
Создание словаря
Словарь можно создать, используя несколько пар ключ-значение, заключенных в фигурные скобки <>, и каждый ключ отделяется от своего значения двоеточием(:). Синтаксис для определения словаря приведен ниже.
В приведенном выше словаре Dict ключи Name и Age представляют собой строку, которая является неизменяемым объектом.
Давайте посмотрим, как создать словарь и напечатать его содержимое.
Python предоставляет встроенный метод функции dict(), который также используется для создания словаря. Пустые фигурные скобки <> используются для создания пустого словаря.
Доступ к значениям словаря
Мы обсудили, как можно получить доступ к данным в списке и кортеже с помощью индексации.
Однако доступ к значениям в словаре можно получить с помощью ключей, поскольку ключи в словаре уникальны.
Доступ к словарным значениям можно получить следующим образом.
Python предоставляет нам альтернативу использованию метода get() для доступа к значениям словаря. Результат будет тот же, что и при индексации.
Добавление значений словаря
Словарь – это изменяемый тип данных, и его значения можно обновлять с помощью определенных ключей. Значение можно обновить вместе с ключом Dict[ключ] = значение. Метод update() также используется для обновления существующего значения.
Примечание. Если пара “ключ-значение” уже присутствует в словаре, значение обновляется. В противном случае новые ключи добавляются в словарь.
Давайте посмотрим на примеры обновления значений словаря:
Удаление элементов с помощью ключевого слова del
Элементы словаря можно удалить с помощью ключевого слова del, как указано ниже.
Последний оператор печати в приведенном выше коде вызвал ошибку, потому что мы пытались напечатать словарь сотрудников, который уже удален.
- Использование метода pop()
Метод pop() принимает ключ в качестве аргумента и удаляет связанное значение. Рассмотрим следующий пример.
Python также предоставляет встроенные методы popitem() и clear() для удаления элементов из словаря. Popitem() удаляет произвольный элемент из словаря, тогда как метод clear() удаляет все элементы из всего словаря.
Итерационный словарь
Словарь можно повторять с помощью цикла for, как указано ниже.
# цикл для печати всех ключей словаря
#for цикл для печати всех значений словаря
#for цикл для печати значений словаря с помощью метода values().
#for цикл для печати элементов словаря с помощью метода items().
Свойства ключей словаря
1. В словаре мы не можем хранить несколько значений для одних и тех же ключей. Если мы передаем более одного значения для одного ключа, то значение, которое было присвоено последним, считается значением ключа.
Рассмотрим следующий пример:
2. В Python ключ не может быть изменяемым объектом. Мы можем использовать числа, строки или кортежи в качестве ключа, но мы не можем использовать какой-либо изменяемый объект, такой как список, в качестве ключа в словаре.
Словарь
Словари, наряду со списками, кортежами и множествами, также входят в состав коллекций (collections), т.е. структур данных, содержащих несколько элементов. Мы уже начали изучать словари на пятом занятии вводного курса. Продолжим этот путь.
Понятие словаря в Питоне
Словарь — неупорядоченный набор элементов с доступом по ключу.

Создание словаря
Пустой словарь можно инициализировать через фигурные скобки < >или функцию dict().
Словарь можно сразу заполнить ключами и значениями.
Словарь можно также создать из вложенных списков.
Иногда бывает полезно создать словарь с заранее известными ключами и заданным значением. В этом нам поможет метод .fromkeys().
Ключи и значения словаря
Ключами словаря могут быть только неизменяемые типы данных. Например, строки, числа, кортежи или логические значения (Boolean). Кроме того, ключи должны быть уникальными и соответственно не могут повторяться.
Значения словаря, наоборот, могут состоять из чисел, строк, пропущенных (NaN) и логических значений, значения типа None, списков, массивов Numpy и вложенных словарей.
Методы .keys(), .values() и .items()
Создадим словарь с данными сотрудника.
Как мы уже знаем, доступ к ключам и значениям можно получить через методы .keys() и .values() соответственно.
Метод .items() возвращает и то, и другое в формате списка из кортежей.
Использование цикла for
Ключи и значения словаря удобно просматривать с помощью цикла for и метода .items().
Как мы уже знаем, если записать результат метода .items() в одну переменную, будут выведены кортежи из ключа и значения.
Использование в цикле for методов .keys() и .values() выводит только ключи или только значения соответственно.
Доступ по ключу и метод .get()
Конкретное значение в словаре можно получить, введя название словаря и затем название ключа в квадратных скобках.
Если такого ключа нет, Питон выдаст ошибку.

Для того чтобы этого не произошло, можно использовать метод .get(). Он также выводит значение по ключу.
Если ключа в словаре нет, метод .get() возвращает значение None.
Проверка наличия ключа и значения в словаре
С помощью оператора in мы можем проверить наличие определенного ключа в словаре.
Важно сказать, что оператор in работает быстрее метода .get().
Метод .values() поможет проверить наличие определенного значения.
Метод .items() поможет проверить наличие пары ключ : значение. Обратите внимание, эту пару мы записываем в форме кортежа.
Операции со словарями
Добавление и изменение элементов
Добавить элемент можно, передав новому ключу новое значение.
Изменить элемент можно передав существующему ключу новое значение.
Метод .update() позволяет соединить два словаря.
Метод .setdefault() не изменяет значение, если указанный ключ уже содержится в словаре.
Если такого ключа нет, ключ и соответствующее значение будут добавлены в словарь.
Удаление элементов
Метод .pop() удаляет элемент по ключу и выводит удаляемое значение.
Убедимся, что этой пары ключа и значения больше нет в словаре.
Ключевое слово del также удаляет элемент по ключу.
Метод .popitem() удаляет и выводит последний добавленный в словарь элемент.
Метод .clear() удаляет все ключи и значения и возвращает пустой словарь.
Ключевое слово del также позволяет удалить словарь целиком.

Сортировка словарей
Для сортировки словарей можно использовать функцию sorted().
Отсортируем ключи этого словаря.
Теперь отсортируем значения с помощью метода .values().
Если мы хотим отсортировать пары ключ : значение по ключу или по значению, вначале воспользуемся методом .items() для извлечения этих пар (кортежей) из словаря.
Затем мы укажем эти кортежи в качестве первого аргумента функции sorted(). Параметру key этой же функции мы передадим lambda-функцию, которая вернет либо ключ lambda x : x [ 0 ] каждого кортежа, либо его значение lambda x : x [ 1 ] . Именно по ним и будет произведена сортировка.
Копирование словарей
Копирование объектов в Питоне (не только словарей) осуществляется с помощью метода .copy().
Как мы видим, исходный словарь не изменился. Так и должно быть.
Теперь давайте попробуем скопировать словарь с помощью оператора присваивания = .
Данные были удалены из обоих словарей. Так быть не должно и поэтому такой метод копирования использовать не стоит.
Функция dir()
На сегодняшнем занятии мне также хотелось бы показать вам функцию dir(), благодаря которой можно увидеть методы того или иного объекта. Давайте посмотрим на методы словаря.
Вначале всегда идут так называемые специальные методы. Они начинаются и заканчиваются символом двойного подчеркивания __ .
Например, когда мы вызываем функцию print() и передаем ей словарь.
На самом деле мы применяем к словарю метод __str__ ( ) .
В большинстве случаев нас будут интересовать методы без символов двойного подчеркивания.
В частности, со всеми этими методами словаря мы уже познакомились.
Dict comprehension
Dictionary comprehension, как и в случае со списками, позволяет превратить один словарь в другой. В процессе этого превращения, элементы исходного словаря могут быть изменены или отобраны на основе какого-либо условия.
Основной целью использования как list, так и dict comprehension является упрощение и повышение читаемости кода.
Приведем базовую схему dict comprehension.

Посмотрим на два несложных примера.
В первом примере умножим каждое значение на два.
Во втором примере сделаем символы всех ключей заглавными с помощью метода .upper().
Теперь предположим, мы хотим отсортировать те пары, в которых значение больше двух, но меньше шести.
Если бы мы выполняли эту задачу с помощью цикла for, то использовали бы оператор И.
Как и в случае list comprehension, применение условия if-else несколько меняет изначальную схему. Предположим, мы хотим определить, какие из значений четные, а какие нечетные.
Dict comprehension можно использовать вместо метода .fromkeys().
Дополнительные примеры
lambda-функция, функции map() и zip()
Пример со списком
Возьмем список фруктов.
Предположим, что мы хотим создать словарь, где ключами будут названия фруктов, а значениями — количество букв в каждом из слов.

Вначале создадим список с количеством символов. Для этого нам понадобится функция map(). Эта функция принимает два аргумента: во-первых, что нужно сделать с каждым из элементов, во-вторых, перечень этих самых элементов.

В нашем случае первым аргументом будет lambda-функция lambda word : len ( word ) , которая просто посчитает длину передаваемого ей слова, а вторым аргументом будет наш список фруктов.
Как вы видите, мы использовали функцию list() для преобразования результата в список.
Остается создать словарь. Для этого с помощью знакомой нам функции zip() мы создадим пары (название фрукта, количество символов) и передадим их функции dict() для создания словаря.
Интересно, что эту же задачу можно решить с помощью list comprehension.
В данном случае функции zip() мы передаем список фруктов и очень простую list comprehension, которая рассчитывает длину слов.
Пример со словарем
Теперь поработаем со словарями. Предположим, что мы продолжаем спрашивать людей об их росте, и у нас есть несколько американцев, которые сообщили свой рост в футах.
Наша задача — создать точно такой же словарь, но чтобы футы были преобразованы в метры. Вначале создадим список с данными о росте в метрах.
Здесь мы снова воспользовались lambda-функцией, которую в качестве аргумента передали в функцию map(). Обратите внимание, вторым аргументом стали значения словаря, полученные через метод .values().
После этого мы можем снова воспользоваться функцией zip(), которой передадим ключи исходного словаря и список данных о росте с округлением до двух знаков после запятой.
Как и в предыдущем примере, эту задачу можно решить с помощью dict comprehension.
Код соответствует основной схеме, приведенной выше, и в целом читается проще, чем конструкция с lambda-функцией и функцией map().
Вложенные словари
Рассмотрим более сложный словарь с информацией о нескольких сотрудниках.
В данном случае ключами словаря выступают id сотрудников, а значениями — вложенные словари с информацией о них.
Базовые операции
Для того чтобы вывести значение элемента вложенного словаря, воспользуемся двойным ключом.
Небольшое отступление от темы. Сложные структуры данных бывает удобно вывести с помощью функции pprint() одноименного модуля.
Функция pprint() расшифровывается как pretty print («красивая печать») и в некоторых случаях справляется со своей задачей лучше обычной функции print().
Посмотрим как можно добавить вложенный словарь.
Изменить значение вложенного словаря можно также с помощью двойного ключа.
Циклы for
Посмотрим, как можно использовать цикл for со вложенными словарями. Давайте заменим тип данных с информацией о возрасте сотрудника с int на float.
Вложенные словари и dict comprehension
Вложенные словари также допускают использование dict comprehension. Предположим, что мы хотим вернуть данные о возрасте из типа float обратно в тип int. Разобьем эту задачу на несколько этапов.
Шаг 1. Просто выведем словарь employees без изменений, используя dict comprehension.
Шаг 2. Создадим еще один dict comprehension, с помощью которого внутри каждого вложенного словаря мы заменим тип данных значения с float на int, если ключ совпадает с age, если не сопадает — оставим значение без изменений (по сути, условие с if-else).
Шаг 3. Вставим второй dict comprehension в первый вместо переменной info. Напомнью, info — это значения внешнего словаря, которые сами по себе являются словарями. Именно к ним мы и применим второй dict comprehension.
С поставленной задачей мы справились. Впрочем, такая сложная схема dict comprehension идет вразрез с самой идеей этого метода, которая заключается в упрощении кода.
Частота слов в тексте
Напоследок разберем очень несложный пример подсчета частоты слов в тексте. Это уже знакомый нам мешок слов (Bag of Words, BoW). В качестве примера возьмем уже известный нам текст про Париж, музеи и искусство.
Предварительная обработка текста
Превратим строку в список слов.
Применим list comprehension, чтобы избавиться от точек и запятых. Помимо этого, переведем все слова в нижний регистр.
Мы готовы создавать мешки слов разными способами.
Способ 1. Условие if-else
Начнем с простых условий if-else.
Способ 2. Метод .get()
Помимо этого мы можем использовать метод .get().
Поясню приведенный код. Метод .get() проверит наличие ключа (слова) в словаре и, если его нет, выведет 0.
Далее мы прибавим к нулю единицу (потому что слово встретилось первый раз) и запишем это слово в наш словарь.
Если такой ключ (слово) уже есть, метод .get() выведет его значение (частоту слова) и мы просто увеличим это значение на один.
Способ 3. Класс Counter модуля collections
Напомню, что этот же функционал реализован в классе Counter модуля collections.
Результат. Обратите внимание, в отличие от мешка слов, который мы создавали на занятии по обработке естественного языка, в число наиболее популярных слов вошли артикли, предлоги и союзы. Они не несут полезной информации о содержании текста. Это так называемые стоп-слова. Кроме того, мы не провели лемматизацию, и поэтому museum и museums считаются разными словами.
На этом мы завершаем наше занятие, полученных знаний должно быть достаточно для дальнейшей работы.
Подведем итог
Сегодня мы подробно рассмотрели, что собой представляет словарь в Питоне.
Мы изучили структуры словаря, основные операции со словарями, использование dict comprehension, а также рассмотрели ряд дополнительных примеров. В частности, мы узнали про возможность создания словаря с помощью lambda-функции, а также функции map() и zip(), вложенные словари и несколько способов подсчета частоты слов в заданном тексте.
Вопросы для закрепления
Вопрос. Есть ли индекс у элементов словаря в Питоне?
Посмотреть правильный ответ
Ответ: нет, элементы словаря в Питоне не упорядочены, и у них отсутствует индекс. Доступ к элементам словаря осуществляется по ключу.
Вопрос. С помощью какого метода можно соединить два словаря в один?
Посмотреть правильный ответ
Ответ: для этого подойдет метод .update().
Вопрос. Почему при копировании объекта в Питоне лучше использовать метод .copy()?
Посмотреть правильный ответ
Ответ: если для копирования использовать оператор присваивания = , то при изменении нового объекта изменится и исходный. Это происходит потому, что новая переменная лишь ссылается на объект, содержащийся в исходной переменной.
В ноутбуке к лекции приведены дополнительные упражнения⧉.
В следующий раз мы поговорим про массив Numpy.
Ответы на вопросы
Вопрос. А что будет, если в словаре есть одинаковые ключи?
Ответ. Давайте посмотрим на примере. При создании словаря с одинаковыми ключами: