Словари dict в Python: руководство с примерами
Словари (dict) играют важную роль в Python. В отличие от списков, словари используются для хранения данных в формате ключ -> значение.
В этой статье мы подробно на примерах разберемся, как использовать эту коллекцию в ваших программах.
Что такое словарь
Словарь - это коллекция, которая хранит элементы в виде "ключ": "значение" также известная как ассоциативный массив. Он схож по своему применению с списками, но есть определенные различия:
- Ключом может быть все, что угодно: от обычной строки до сложных объектов.
- В новых версиях Python (>= 3.7) элементы будут храниться отсортированными по ключу в порядке добавления.
Как создать словарь
Для того, чтобы создать словарь, мы можем использовать фигурные скобки:
ages = {"Юра": 18, "Маша": 22, "Паша": 30}
print(ages)Вывод:
{'Юра': 18, 'Маша': 22, 'Паша': 30}Есть второй способ: мы можем использовать конструктор dict:
translations = dict(hello="привет", world="мир")
print(translations)Вывод:
{'hello': 'привет', 'world': 'мир'}В Python можно использовать конструктор dict для создания словаря из списка пар “ключ-значение”:
translations = dict([
["hello", "привет"],
["world", "мир"]
])
print(translations)Вывод:
{'hello': 'привет', 'world': 'мир'}Также хочу заметить, Python не позволяет иметь несколько элементов с одинаковым ключом в словаре:
letters = {
"A": 1,
"A": 2,
}
print(letters)Вывод:
{'A': 2}Как вы можете видеть, "A": 2 перезаписало "A": 1.
Что будет выведено на экран?
dictionary = dict([
["apple", "яблоко"],
["orange", "апельсин"],
["apple", "яблоко-фрукт"]
])
print(dictionary)Список словарей
Поскольку словарь dict - это просто значение в Python, мы можем хранить словари в других коллекциях. Например, мы можем создать список словарей:
dictionaries = [
{"привет": "hello", "мир": "world"},
{"A": 1, "B": 2, "C": 3},
]
print(dictionaries)Вывод:
[{'привет': 'hello', 'мир': 'world'}, {'A': 1, 'B': 2, 'C': 3}]Получить элемент из словаря
Чтобы получить значение элемента из словаря по ключу, мы можем воспользоваться квадратными скобками как в списках:
letters = {"A": 1, "B": 2, "C": 3}
print(letters["B"]) # 2
print(letters["C"]) # 3Но если мы попробуем обратиться к элементу, которого не существует, мы получим ошибку:
empty_dict = {}
print(empty_dict["нет ключа"])Ошибка:
Traceback (most recent call last):
...
KeyError: 'нет ключа'Чтобы не возникала ошибка при обращении к несуществующему ключу, нужно использовать метод dict.get():
names = {"Андрей": "Andrew", "Макс": "Max"}
print("Дима:", names.get("Дима"))Вывод:
Дима: NoneКак вы можете видеть, метод get() вернул None, поскольку имени "Дима" в словаре нету.
Количество элементов в словаре
Чтобы получить количество элементов в словаре, можно воспользоваться стандартной функцией len():
letters = {"A": 1, "B": 2, "C": 3}
print("количество букв:", len(letters))Вывод:
количество букв: 3Добавить элемент в словарь
Для того, чтобы добавить новый элемент в словарь (или изменить старый), мы можем использовать знак присваивания:
lang = {"C++": "static", "Rascal": "unknown"}
lang["Python"] = "dynamic"
lang["Rascal"] = "hybrid"
print(lang)Вывод:
{'C++': 'static', 'Rascal': 'hybrid', 'Python': 'dynamic'}Что будет выведено на экран?
fruits = {"apple": "red", "banana": "yellow"}
fruits["mango"] = "yellow"
fruits["banana"] = "green"
print(fruits)Чтобы добавить или п оменять сразу несколько элементов в словаре, можно использовать метод dict.update():
lang = {"C++": "static", "Rascal": "unknown"}
lang.update(Python="dynamic", Rascal="hybrid")
print(lang)Вывод совпадает с предыдущим:
{'C++': 'static', 'Rascal': 'hybrid', 'Python': 'dynamic'}В метод
updateможно передать другой словарь.
Есть еще один метод, который позволяет добавить элемент в словарь, если элемента с таким ключом еще нет:
first_seen = {"Дима": "вчера"}
first_seen.setdefault("Дима", "сегодня")
first_seen.setdefault("Маша", "сегодня")
print(first_seen)Вывод:
{'Дима': 'вчера', 'Маша': 'сегодня'}Как вы можете видеть, setdefault добавил элемент с ключом "Маша", не поменяв существующий с ключом "Дима".
Удалить элемент из словаря
Python поддерживает несколько способов удалить элемент из словаря.
Самый простой способ удалить элемент - воспользоваться ключевым словом del:
population = {"Москва": 12_000_000, "Абракадабра": 0}
del population["Абракадабра"]
print(population)Вывод:
{'Москва': 12000000}У типа dict есть специальный метод pop, который можно использовать вместо del:
population = {"Москва": 12_000_000, "Абракадабра": 0}
value = population.pop("Абракадабра")
print(value)
print(population)Вывод:
0
{'Москва': 12000000}Метод pop() поддерживает значение по умолчанию и вернет его, если элемент с данным ключом не найден:
empty = {}
print(empty.pop("key", "default value")) # вывод: default valueЕсли нам нужно удалить все элементы из словаря, то мы можем использовать метод dict.clear():
letters = {"A": 1, "B": 2}
letters.clear()
print(letters)Вывод:
{}Метод dict.popitem() удаляет последний добавленный элемент в словаре:
letters = {"B": 2}
letters["A"] = 1
letter = letters.popitem()
print("removed:", letter)
print("all:", letters)Вывод:
removed: ('A', 1)
all: {'B': 2}До версии Python 3.7,
popitemудалял случайный элемент из словаря.
Перебор элементов словаря
Цикл for позволяет нам перебрать все ключи, которые есть в словаре:
students = {"Женя": 20, "Катя": 30, "Марк": 40}
for name in students:
print(name, students[name])Вывод:
Женя 20
Катя 30
Марк 40Метод dict.keys()
Метод keys() позволяет получить все ключи, которые хранятся в словаре:
students = {"Женя": 20, "Катя": 30, "Марк": 40}
for name in students.keys():
print(name)Вывод:
Женя
Катя
МаркПо умолчанию, цикл for перебирает именно ключи словаря.
Метод dict.values()
Чтобы вместо ключей получить значения, используйте метод values():
students = {"Женя": 20, "Катя": 30, "Марк": 40}
for age in students.values():
print(age)Вывод:
20
30
40Метод dict.items()
Часто бывает удобно получить сразу ключ вместе со значением при переборе словаря. Тут метод items() приходится как нельзя кстати:
students = {"Женя": 20, "Катя": 30, "Марк": 40}
for name, age in students.items():
print(name, age)Вывод:
Женя 20
Катя 30
Марк 40Словарь со словарями
Поскольку словари в Python могут хранить любые значения, нам ничего не мешает создать словарь словарей:
game = {
"влево": {
"влево": "пусто",
"вправо": "приз!",
},
"вправо": {
"влево": "пусто",
"вправо": "поощрительный приз",
},
}
print(game["влево"]["вправо"]) # приз!
print(game["вправо"]["вправо"]) # поощрительный призКак вы можете видеть, работа с вложенными словарями ничем не отличается от работы с обычными словарями.
Проверить наличие ключа в словаре
Часто возникает необходимость выпо лнить код в зависимости от наличия определенного ключа в словаре. Ключевое слово in позволяет сделать именно это:
country = {"name": "Франция", "population": 67_000_000}
if "name" in country:
print("Страна:", country["name"])
else:
print("Страна без названия")Вывод:
Страна: ФранцияКак скопировать словарь
В Python есть специальный метод для копирования словарей - copy():
original = {"A": 1, "B": 2}
copy = original.copy()
copy["C"] = 3
print("original:", original)
print("copy: ", copy)Вывод:
original: {'A': 1, 'B': 2}
copy: {'A': 1, 'B': 2, 'C': 3}Если по каким-то причинам вы не хотите использовать метод copy(), то вы можете создать новый словарь при помощи конструктора dict:
original = {"A": 1, "B": 2}
copy = dict(original) # конструктор вместо метода copy
copy["C"] = 3
print("original:", original)
print("copy: ", copy)Вывод не поменялся:
original: {'A': 1, 'B': 2}
copy: {'A': 1, 'B': 2, 'C': 3}Генератор словарей
Python позволяет создавать словари на основе различных данных с использованием механизма генераторов:
sqr = {x: x * x for x in range(1, 4)}
print(sqr)Вывод:
{1: 1, 2: 4, 3: 9}Как и в случае генераторов для списков, мы можем использовать if для фильтрации элементов в словаре:
sqr = {x: x * x for x in range(1, 8) if x % 2 == 0}
print(sqr)Вывод:
{2: 4, 4: 16, 6: 36}Какой будет вывод следующего Python кода?
items = {"a": 1, "b": 2, "c": 3}
doubled = {k: v * 2 for k, v in items.items() if v % 2 != 0}
print(doubled)Функция type для словарей
Если вам требуется убедиться, что переменная содержит словарь, то вы можете воспользоваться функцией type:
number = 1
d = {1: 2, 2: 3}
print("number is a dict:", type(number) == dict)
print("d is a dict: ", type(d) == dict)Вывод:
number is a dict: False
d is a dict: TrueУпражнения
- Создание базового словаря:
Напишите программу на Python, которая позволяет пользователю вводить пары ключ -> значение и сохраняет их в словарь. После того как пользователь завершит ввод, программа должна выводить весь словарь. - Поиск по ключу:
Реализуйте функционал, который позволит пользователю вводить ключ, а программа будет возвращать соответствующее значение из словаря. Если такого ключа нет - выводите соответствующее сообщение. - Добавление и удаление элементов:
Расширьте вашу программу так, чтобы пользователь мог добавлять новые пары ключ -> значение или удалять существующие по ключу. После каждого изменения, выводите обновленный словарь на экран.
Если хотите всегда быть в курсе последних новостей в мире программирования и IT, подписываетесь на мой Telegram-канал, где я делюсь свежими статьями, новостями и полезными советами. Буду рад видеть вас среди подписчиков!
Обсуждение