Словари в Python: что нужно знать и как пользоваться
Продолжаем осваивать «змеиный» язык. Сегодня поговорим о словарях — важном инструменте для хранения данных в Python.


Иллюстрация: Оля Ежак для Skillbox Media
Нет, словари нужны не для того, чтобы переводить запутанный код программистов на человеческий. Их используют для того, чтобы удобно хранить данные и быстро получать к ним доступ по запросу. В этой статье подробно разберём, что такое словари и как с ними работать в Python.
А если вы уже знакомы со словарями и хотите освежить в памяти отдельные моменты, используйте навигацию или скачайте шпаргалку в конце статьи.
Что такое словарь
Словарь в языках программирования — это что-то вроде телефонной книги, где под каждым номером скрывается какой-то человек.
Только на языке разработчиков номера называют ключами, а людей, которым они принадлежат, — значениями. Вот как это можно представить в виде таблицы:
Ключ | Значение |
---|---|
8 (984) 123-53-11 | Дизайнер Валера |
8 (934) 256-32-54 | Менеджер Егор (не отвечать) |
При этом ключи в словарях уникальны, а значения могут повторяться. Условно говоря, дизайнеру Валере может принадлежать сколько угодно номеров — но у каждого номера может быть только один владелец.
Мы привели пример с телефонной книгой, но вы можете хранить в словаре всё что угодно: названия песен, имена покупателей, товары в интернет-магазине и так далее. При этом стоит помнить важное правило:
Ключами могут быть строки, числа (целые и дробные) и кортежи. Нельзя использовать списки, словари и другие изменяемые типы данных. В значения можно «положить» любые типы данных — и даже новые словари.
Например, давайте в качестве ключа укажем название книги, а значением сделаем её автора.
Ключ | Значение |
---|---|
«Гарри Поттер и философский камень» | Джоан Роулинг |
«Убить пересмешника» | Харпер Ли |
«Грокаем алгоритмы» | Адитья Бхаргава |
Теперь, если у нас есть название книги, мы можем быстро найти её автора. Этим словари и удобны: знаем ключ — моментально получаем значение.
? Словарь — это неупорядоченная структура данных. Это значит, что все пары «ключ — значение» хранятся в произвольном порядке. Идея в том, что нам неважно, где находится элемент: в начале, в серединие или в конце. Важно то, что он лежит где-то внутри и мы можем при случае его достать.
Пример упорядоченной структуры — это список. Там у всех элементов есть свои индексы, благодаря которым их можно отсортировать как душе угодно. Если хотите больше знать о списках, читайте другую нашу статью. А мы пойдём дальше — создадим наш первый словарь.
Как создать словарь в Python
Словари в Python оформляются фигурными скобками. Внутри них находятся пары «ключ — значение». Первым пишется ключ, а затем, через двоеточие, — значение. Сами пары отделяются друг от друга запятыми.
books = {
'Гарри Поттер и философский камень' : 'Джоан Роулинг',
'Убить пересмешника' : 'Харпер Ли'
}
Если вместо значений не указать ничего, язык автоматически создаст множество (а не словарь), где будут только ключи:
books = {
'Гарри Поттер и философский камень',
'Убить пересмешника'
}
Выведем на экран содержимое словаря с помощью функции print:
print(books)
> {'Гарри Поттер и философский камень', 'Убить пересмешника'}
Результат:
{'Гарри Поттер и философский камень', 'Убить пересмешника'}
Теперь попробуем создать и вывести полноценный словарь:
dict = {
'Гарри Поттер и философский камень' : 'Джоан Роулинг',
'Убить пересмешника' : 'Харпер Ли'
}
print(dict)
> {'Гарри Поттер и философский камень': 'Джоан Роулинг', 'Убить пересмешника': 'Харпер Ли'}
Результат:
{'Гарри Поттер и философский камень': 'Джоан Роулинг', 'Убить пересмешника': 'Харпер Ли'}
Бинго!
Операции со словарями
Мало просто создать словарь — иногда нам нужно взаимодействовать с отдельными его элементами. Разберёмся с базовыми операциями.
Как достать значение ключа из словаря
Если нам известен ключ, можно быстро извлечь из словаря его значение — для этого используйте квадратные скобки.
# Создаём словарь
dict = {
'Гарри Поттер и философский камень' : 'Джоан Роулинг',
'Убить пересмешника' : 'Харпер Ли'
}
# В квадратных скобках указываем значение
harryPotterAuthor = dict['Гарри Поттер и философский камень']
print(harryPotterAuthor)
# На выходе получаем значение
> Джоан Роулинг
Если указать неправильный ключ, мы получим ошибку:
harryPotterAuthor = dict['Гарри Поттер и драгоценный камень']
print(harryPotterAuthor)
> ERROR!
Traceback (most recent call last):
File "<string>", line 6, in <module>
KeyError: 'Гарри Поттер и драгоценный камень'
Ошибка говорит нам, что по заданному ключу ничего не нашлось.
Как добавить новый элемент в словарь Python
Теперь попробуем добавить в наш словарь с книгами ещё одну запись. Чтобы это сделать, в квадратных скобках указываем ключ, а потом, через знак равенства, добавляем значение.
dict['Преступление и наказание'] = 'Фёдор Достоевский'
Пробуем вывести содержимое словаря на экран — видим, что новая запись добавилась в самом конце.
print(dict)
> {'Гарри Поттер и философский камень': 'Джоан Роулинг', 'Убить пересмешника': 'Харпер Ли', 'Преступление и наказание': 'Фёдор Достоевский'}
Готово!
Как удалить элемент из словаря Python
Чтобы удалить элемент из словаря, используют команду del. При этом нам достаточно ввести только ключ, а значение удалится вместе с ним.
del dict['Убить пересмешника']
print(dict)
> {'Гарри Поттер и философский камень': 'Джоан Роулинг'}
Синтаксис немного необычный: мы пишем команду del перед тем, как обратиться к словарю. Но всё прекрасно работает, мы проверили :)
Как изменить значение ключа в словаре
Здесь всё просто: в квадратных скобках пишем уже существующий ключ, а через знак равенства указываем новое значение.
dict['Гарри Поттер и философский камень'] = 'Михаил Лермонтов'
Выводим в консоль — видим, что значение первой пары поменялось.
print(dict)
> {'Гарри Поттер и философский камень': 'Михаил Лермонтов', 'Убить пересмешника': 'Харпер Ли'}
Важное замечание. Если указать неправильный ключ, то мы вместо обращения к уже существующей паре создадим новую:
dict['Барри Воттер и философский камень'] = 'Михаил Лермонтов'
print(dict)
> {'Гарри Поттер и философский камень': 'Джоан Роулинг', 'Убить пересмешника': 'Харпер Ли', 'Барри Воттер и философский камень': 'Михаил Лермонтов'}
Чтобы избежать таких ситуаций, можно использовать безопасный метод get(), о котором мы поговорим в следующем разделе.
Какие методы работают со словарями в Python
Для словарей создали много полезных методов, которые облегчают привычные операции — например, можно одной функцией добавить в словарь несколько элементов или предусмотреть обработку ошибок.
Метод update()
Что делает: добавляет в словарь одну или сразу несколько пар «ключ — значение».
Как использовать: объявляем метод update(), внутри которого создаём новый словарь из элементов, которыми хотим дополнить существующий.
dict = {
'Гарри Поттер и философский камень' : 'Джоан Роулинг',
'Убить пересмешника' : 'Харпер Ли'
}
dict.update({
'Преступление и наказание' : 'Фёдор Достоевский',
'Чемодан' : 'Сергей Довлатов'
})
print(dict)
> {'Гарри Поттер и философский камень': 'Джоан Роулинг', 'Убить пересмешника': 'Харпер Ли', 'Преступление и наказание': 'Фёдор Достоевский', 'Чемодан': 'Сергей Довлатов'}
Метод get()
Что делает: возвращает значение из словаря по ключу — или None, если такого ключа не существует.
harryPotterAuthor = dict.get('Гарри Поттер и философский камень')
print(harryPotterAuthor)
> Джоан Роулинг
Попробуем передать ключ, которого нет в словаре:
harryPotterAuthor = dict.get('Гарри Поттер в путешествии по Золотому кольцу России')
print(harryPotterAuthor)
> None
? У этого метода есть тайный козырь в рукаве. Вместо сухого и формального None он может вывести любое значение, которое вы захотите, — например, сообщение об ошибке. Для этого надо прописать нужное значение вторым аргументом. Мы решили добавить строчку с ошибкой:
harryPotterAuthor = dict.get('Гарри Поттер в путешествии по Золотому кольцу России', 'Такого ключа нет')
print(harryPotterAuthor)
> Такого ключа нет
В этом состоит главное преимущество метода get() перед обычными квадратными скобками — для обработки ошибок можно не писать объёмные конструкции try/except, а ограничиться всего одной аккуратной строчкой.
Метод pop()
Что делает: удаляет элемент из словаря по ключу.
harryPotterAuthor = dict.pop('Гарри Поттер и философский камень')
print(harryPotterAuthor)
> Джоан Роулинг
print(dict)
> {'Убить пересмешника': 'Харпер Ли'}
Метод keys()
Что делает: возвращает все ключи из словаря — но без значений.
dictKeys = dict.keys()
print(dictKeys)
> ['Гарри Поттер и философский камень', 'Убить пересмешника']
Метод values()
Что делает: возвращает все значения из словаря — но без ключей.
dictValues = dict.values()
print(dictValues)
> ['Джоан Роулинг', 'Харпер Ли']
Метод items()
Что делает: возвращает все пары «ключ — значение».
dictItems = dict.items()
print(dictItems)
> [('Гарри Поттер и философский камень', 'Джоан Роулинг'), ('Убить пересмешника', 'Харпер Ли')]
Что запомнить
Лучше не заучивать голую теорию, а сразу отрабатывать знания на практике. Начать можно, например, с бесплатных упражнений на w3schools.com. А чтобы быстро находить нужный метод и не ходить каждый раз в гугл, можете сохранить себе шпаргалку по ссылке или таблицу ниже.
Метод | Что делает |
---|---|
clear() | Удаляет все элементы из словаря |
copy() | Создаёт копию словаря |
update() | Добавляет в словарь одну или несколько пар «ключ — значение» |
pop() | Удаляет элемент из словаря по ключу |
keys() | Возвращает список ключей из словаря |
values() | Возвращает список значений из словаря |
items() | Возвращает все пары «ключ — значение» |
popitem() | Удаляет последнюю добавленную пару «ключ — значение» |
get() | Возвращает значение из словаря по ключу — или None, если такого ключа не существует. Можно указать своё значение в качестве второго аргумента |
setdefault() | Возвращает значение указанного ключа. Если ключа не существует, создаёт его и добавляет в словарь со значением None или тем, что вы добавите в качестве второго аргумента |