Когда мы слышим слово «словарь», чаще всего представляем толстую книгу, где каждому слову соответствует определение. В Python тоже есть словари. Только вместо слов и определений в них — ключи и значения. В этой статье разберемся, что такое словари в Python, как их создавать и как использовать в реальных задачах.
Что такое словари и как их создать
Словарь в языке Python — это неупорядоченная коллекция элементов, в которой каждый элемент имеет ключ и связанное с ним значение. Общий синтаксис определения словаря имеет следующий вид:
dictionary = { key1: value1, key2: value2, ....}
Как видно, ключ и связанное с ним значение разделяются двоеточием, а сами элементы словаря пишутся через запятую и заключаются в фигурные скобки. Вот пример определения словаря, содержащего первые три планеты Солнечной системы:
planets = {1: "Меркурий", 2: "Венера", 3: "Земля"}
В качестве ключей здесь выступают порядковые номера планет, а в качестве значений приводятся их названия. Иногда бывает нужно создать пустой словарь, чтобы потом наполнить его элементами. Делается это так:
dict = {}
Или же при помощи специальной функции dict:
dict = dict()
Создадим с помощью функции dict словарь. Сделать это можно так:
planets = dict({1: "Меркурий", 2: "Венера", 3: "Земля"})
Здесь мы передали на вход функции dict само определение словаря. Также можно попробовать преобразовать список в словарь:
planets_list = [ [1, "Меркурий"], [2, "Венера"], [3, "Земля"] ] planets = dict(planets_list)
Еще можно превратить в словарь кортеж:
planets_tuple = ( (1, "Меркурий"), (2, "Венера"), (3, "Земля") ) planets = dict(planets_tuple)
В двух последних примерах мы создали список и кортеж, а потом просто передали их на вход функции dict — и таким образом получили словарь. Далее рассмотрим, как получать, изменять, а также удалять элементы словаря.
Получение, добавление, изменение и удаление элементов
В этом разделе рассмотрим на простых примерах, как можно получать, добавлять, изменять и удалять элементы словаря.
Получение элементов. Метод get
Допустим, у нас есть вот такой словарь:
email = {"Кристина": "kristina@mail.ru", "Олег": "oleg@gmail.com", "Маша": "maria@ya.ru"}
Как получить из этого словаря, например, электронную почту Олега? Сделать это можно, обратившись к нужному элементу по его ключу:
print(email["Олег"])
В результате получим такой вывод в консоли:
(env) alex@alex-pc:~/Projects/dict$ /home/alex/env/bin/python3 /home/alex/Projects/dict/dictionary.py oleg@gmail.com
Почту получили. Но если мы попытаемся получить значение, ключ которого отсутствует в словаре, то получим ошибку KeyError. Чтобы этого избежать, лучше всего проверить наличие элемента в словаре. Сделать это можно при помощи условного оператора if:
key = "Олег" if key in email: user_email = email[key] print(user_email) else: print(f"Элемент с ключом {key} не найден")
Получить значение элемента можно и другим способом — с помощью метода get. Просто передаём ему на вход ключ, и он вернёт нужное значение:
user_email = email.get("Олег") print(user_email)
У метода get можно использовать и второй аргумент. Он нужен, чтобы определить значение по умолчанию. То есть, если элемент не найден, будет выведено значение второго аргумента:
user_email = email.get("Михаил", "Неизвестный пользователь") print(user_email)
В консоли получим:
(env) alex@alex-pc:~/Projects/dict$ /home/alex/env/bin/python3 /home/alex/Projects/dict/dictionary.py Неизвестный пользователь
Добавление элементов
Теперь добавим в словарь еще один элемент. Пусть это будет некий Виктор с почтой victor@mail.ru:
email["Виктор"] = "victor@mail.ru"
Убедимся, что элемент успешно добавлен. Выведем весь словарь в консоль:
print(email)
Получим такой вывод:
(env) alex@alex-pc:~/Projects/dict$ /home/alex/env/bin/python3 /home/alex/Projects/dict/dictionary.py {'Кристина': 'kristina@mail.ru', 'Олег': 'oleg@gmail.com', 'Маша': 'maria@ya.ru', 'Виктор': 'victor@mail.ru
Элемент успешно добавлен. Можем обратиться к нему по ключу:
print(email["Виктор"])
Результат:
(env) alex@alex-pc:~/Projects/dict$ /home/alex/env/bin/python3 /home/alex/Projects/dict/dictionary.py victor@mail.ru
Изменение элементов
А как нам изменить элемент? Допустим, что нам нужно поменять почту Виктора. Как это сделать? Поступаем так же, как и при добавлении элемента. Обращаемся к нему по ключу и связываем с ним новое значение:
email["Виктор"] = "victor@rambler.ru"
То есть это работает так: если ключ найден, то его значение перезаписывается, а если такой ключ не обнаружен, то добавляется новый элемент с этим ключом. Проверим, записалась ли новая почта Виктора:
print(email["Виктор"])
Получим:
env) alex@alex-pc:~/Projects/dict$ /home/alex/env/bin/python3 /home/alex/Projects/dict/dictionary.py victor@rambler.ru
Как видим, все довольно просто!
Удаление элементов. Оператор del и методы pop и clear
Удалить элемент тоже не составит особого труда. Для этого используется оператор del. Удалим из словаря все того же Виктора:
del email["Виктор"]
Выведем весь словарь и убедимся, что Виктора там больше нет:
(env) alex@alex-pc:~/Projects/dict$ /home/alex/env/bin/python3 /home/alex/Projects/dict/dictionary.py {'Кристина': 'kristina@mail.ru', 'Олег': 'oleg@gmail.com', 'Маша': 'maria@ya.ru'}
Если при удалении вдруг окажется, что такого элемента не обнаружено, то мы получим исключение KeyError. Поэтому лучше всего перед удалением сначала проверить наличие элемента с данным ключом в словаре. Делается это также, как и в вышеприведенном случае с получением значения:
key = "Виктор" if key in email: del email[key] else: print(f"Элемент с ключом {key} не найден")
Также для удаления элементов можно использовать метод pop:
user_email = email.pop("Виктор")
В переменную user_email будет записана почта Виктора, а сам элемент с ключом «Виктор» будет удален. Также для этого метода доступен и второй аргумент. Это значение по умолчанию. Оно будет возвращено в случае, если элемент с данным ключом не будет найден:
user_email = email.pop("Михаил", "Неизвестный пользователь")
Как видим, метод pop во многом похож на ранее рассмотренный метод get. Для удаления всех элементов словаря можно воспользоваться методом clear:
email.clear() print(email)
Вывод будет таким:
env) alex@alex-pc:~/Projects/dict$ /home/alex/env/bin/python3 /home/alex/Projects/dict/dictionary.py {}
Двигаемся дальше.
Обновление словаря. Методы update и copy
Пусть нам даны два словаря:
dict1 = {"Верификация": "Проверка подлинности данных", "Демаркация": "Разметка границы на местности"} dict2 = {"Моветон": "Дурной тон, невоспитанность", "Синопсис": "Изложение некоторой темы в сильно сжатом и обобщенном виде"}
Как объединить эти два словаря в один? Это можно сделать при помощи метода update. Если вызвать этот метод для первого словаря, а на вход метода подать второй словарь, то список элементов первого словаря будет дополнен элементами второго словаря. Вот так это делается:
dict1.update(dict2)
Выведем теперь в консоль первый словарь:
print(dict1)
Получим:
(env) alex@alex-pc:~/Projects/dict$ /home/alex/env/bin/python3 /home/alex/Projects/dict/dictionary.py {'Верификация': 'Проверка подлинности данных', 'Демаркация': 'Разметка границы на местности', 'Моветон': 'Дурной тон, невоспитанность', 'Синопсис': 'Изложение некоторой темы в сильно сжатом и обобщенном виде'}
Как видим, первый словарь был успешно обновлен. А вот второй словарь остался без изменений. Иногда бывает полезно сохранить все исходные словари. Для этого можно воспользоваться методом copy. Он создаст копию нужного словаря и запишет ее в новый словарь:
dict3 = dict1.copy()
Вызывать этот метод необходимо до обновления словаря.
Перебор элементов словаря. Методы items, keys и values
При помощи цикла for можно осуществить перебор всех элементов словаря. Возьмем вот такой словарь:
main_city = {"Россия": "Москва", "Китай": "Пекин", "Северная Корея": "Пхеньян"}
И напишем для него такой цикл:
for key in main_city: print(f"Страна: {key} Столица: {main_city[key]}")
Запустив эту программу на исполнение, в консоли получим такой вывод:
(env) alex@alex-pc:~/Projects/dict$ /home/alex/env/bin/python3 /home/alex/Projects/dict/dictionary.py Страна: Россия Столица: Москва Страна: Китай Столица: Пекин Страна: Северная Корея Столица: Пхеньян
Также для перебора элементов можно использовать метод items. Этот метод возвращает набор кортежей. В каждом кортеже содержатся ключ и связанное с ним значение. Их мы сразу же можем записать в переменные key и value:
for key, value in main_city.items(): print(f"Страна: {key} Столица: {value}")
В результате получим такой же вывод, как и в прошлом примере. Также можно отдельно перебирать ключи с помощью метода keys:
for key in main_city.keys(): print(key)
Результат:
(env) alex@alex-pc:~/Projects/dict$ /home/alex/env/bin/python3 /home/alex/Projects/dict/dictionary.py Россия Китай Северная Корея
А при помощи метода values есть возможность отдельно перебрать значения элементов:
for value in main_city.values(): print(value)
Вывод:
(env) alex@alex-pc:~/Projects/dict$ /home/alex/env/bin/python3 /home/alex/Projects/dict/dictionary.py Москва Пекин Пхеньян
Дальше рассмотрим словари с более сложной структурой.
Комплексные словари
Рассмотрим следующий словарь, содержащий список планет земной группы:
planets = { "Меркурий": { "Номер": "1", "Спутники": "Нет" }, "Венера": { "Номер": "2", "Спутники": "Нет" }, "Земля": { "Номер": "3", "Спутники": "Луна" }, "Марс": { "Номер": "4", "Спутники": "Фобос, Деймос" } }
Здесь мы видим словарь, значения элементов которого представляют собой тоже словари. Чтобы получить значение «Луна» нам потребуется два ключа:
print(planets["Земля"]["Спутники"])
Также можно использовать уже знакомый нам метод get:
satellite = planets["Земля"].get("Спутники") print(satellite)
Вывод в консоли будет таким:
(env) alex@alex-pc:~/Projects/dict$ /home/alex/env/bin/python3 /home/alex/Projects/dict/dictionary.py Луна
Добавление и изменение элементов здесь происходит по тому же принципу, что мы рассматривали ранее во втором разделе этой публикации: если указанный элемент имеется, то он будет изменен, а если отсутствует, то будет добавлен. Добавим, например, для Марса указание группы, к которой принадлежит планета:
planets["Марс"]["Группа"] = "Земная группа" print(planets)
Результат:
(env) alex@alex-pc:~/Projects/dict$ /home/alex/env/bin/python3 /home/alex/Projects/dict/dictionary.py {'Меркурий': {'Номер': '1', 'Спутники': 'Нет'}, 'Венера': {'Номер': '2', 'Спутники': 'Нет'}, 'Земля': {'Номер': '3', 'Спутники': 'Луна'}, 'Марс': {'Номер': '4', 'Спутники': 'Фобос, Деймос', 'Группа': 'Земная группа'}}
С удалением здесь тоже все довольно просто. Удалим, например, Венеру:
del planets["Венера"] print(planets)
Получим:
(env) alex@alex-pc:~/Projects/dict$ /home/alex/env/bin/python3 /home/alex/Projects/dict/dictionary.py {'Меркурий': {'Номер': '1', 'Спутники': 'Нет'}, 'Земля': {'Номер': '3', 'Спутники': 'Луна'}, 'Марс': {'Номер': '4', 'Спутники': 'Фобос, Деймос', 'Группа': 'Земная группа'}}
Или же удалим у Венеры информацию о спутниках:
del planets["Венера"]["Спутники"] print(planets)
Вывод:
(env) alex@alex-pc:~/Projects/dict$ /home/alex/env/bin/python3 /home/alex/Projects/dict/dictionary.py {'Меркурий': {'Номер': '1', 'Спутники': 'Нет'}, 'Венера': {'Номер': '2'}, 'Земля': {'Номер': '3', 'Спутники': 'Луна'}, 'Марс': {'Номер': '4', 'Спутники': 'Фобос, Деймос', 'Группа': 'Земная группа'}}
Далее предлагаем выполнить небольшое самостоятельное задание.
Задание для самостоятельного выполнения
Дана таблица:
Требуется составить из этой таблицы словарь и дополнить его данными из нижеследующей таблицы:
Далее нужно перебрать все элементы словаря и вывести их в консоль.
Решение
Пусть название созвездия будет ключом, а альфа созвездия значением. Тогда, исходя из данных первой таблицы, получим такой словарь:
constellations = {"Дева": "Спика", "Эридан": "Ахернар", "Волопас": "Арктур", "Андромеда": "Альферац", "Кассиопея": "Шедар"}
Теперь добавим в него данные из второй таблицы:
constellations["Персей"] = "Мирфак" constellations["Лира"] = "Вега"
Сделать это можно еще и вот так:
constellations.update({"Персей": "Мирфак", "Лира": "Вега"})
Осталось только перебрать элементы при помощи цикла for и вывести их в консоль:
for key, value in constellations.items(): print(f"Название созвездия: {key} Альфа созвездия: {value}")
В результате получим:
(env) alex@alex-pc:~/Projects/dict$ /home/alex/env/bin/python3 /home/alex/Projects/dict/dictionary.py Название созвездия: Дева Альфа созвездия: Спика Название созвездия: Эридан Альфа созвездия: Ахернар Название созвездия: Волопас Альфа созвездия: Арктур Название созвездия: Андромеда Альфа созвездия: Альферац Название созвездия: Кассиопея Альфа созвездия: Шедар Название созвездия: Персей Альфа созвездия: Мирфак Название созвездия: Лира Альфа созвездия: Вега