Продолжаем разбираться с массивами в Python. Напомним: мы уже писали о списках, а затем о кортежах. Сегодня говорим о словарях.
Если вы только начинаете знакомиться с языком программирования Python, посмотрите наш мастрид — в нём мы собрали самое важное и интересное для старта.
Что такое словарь
Словарь dict
— одна из реализаций ассоциативного массива, которая позволяет хранить коллекции элементов в парах «ключ : значение». Ключи должны быть уникальными, а вот значения могут совпадать и быть любого типа данных.
В Python словари основаны на хеш-таблицах — структурах данных, в которых можно быстро выполнять операции вставки, удаления и поиска элементов. Поэтому ключами могут быть только хешируемые, то есть неизменяемые, объекты, например строки, кортежи или числа, но не списки.
Для создания словаря используют фигурные скобки или функцию dict()
:
my_dict = {'яблоко': 5, 'апельсин': 3, 'груша': 7}
В этом словаре три элемента: ключи «яблоко», «апельсин» и «груша» и соответствующие им значения 5, 3 и 7. Ключи и значения разделяются двоеточием, каждая пара «ключ : значение» отделяется запятой.
У словарей есть несколько полезных свойств:
- Уникальность ключей. Это позволяет быстро находить и обращаться к значениям по ключу.
- Изменяемость. Элементы словаря можно добавлять, изменять и удалять.
- Динамическое расширение. Размер словаря не нужно определять заранее, поскольку он расширяется динамически по мере добавления новых элементов.
- Гибкость типа данных. Значения в словаре могут быть любого типа данных: числа, строки, списки, кортежи и другие словари.
- Быстрый доступ по ключу. За счёт использования хеш-таблиц значения можно находить по ключу даже в больших словарях.
- Неупорядоченность. Порядок элементов в словаре может меняться при добавлении, удалении или изменении элементов.
- Итерируемость. Словари можно перебирать с помощью циклов, например
for
. При этом в зависимости от метода итерации возвращаются ключи, значения или пары «ключ — значение». - Возможность использования в качестве хранилища данных. Большие объёмы данных можно организовывать и хранить в словарях, присваивая каждому элементу уникальный ключ для быстрого доступа.
Словари используют, когда есть два набора данных с некоторой общей связью. Например, у нас есть два списка: список студентов и список с их средними баллами по дисциплине «Программирование на Python». Мы можем упорядочить данные в этих списках так, чтобы индексы студента и оценки совпадали. Но на это требуются ресурсы, и не факт, что порядок сохранится. Поэтому здесь лучше использовать словарь, где ключами будут номера зачётных книжек, а значениями — оценки.
Операции над словарями
Над словарями можно выполнять различные операции. Создадим словарь из имён и ролей и рассмотрим операции на его примере:
kod_dict = {'Михаил': 'главред', 'Абдурахман': 'автор', 'Ира': 'корректор'}
Получение длины. Функция len()
находит количество пар «ключ : значение» в словаре:
# объявляем словарь
kod_dict = {'Михаил': 'главред', 'Абдурахман': 'автор', 'Ира': 'корректор'}
# присваиваем length значение длины словаря
length = len(kod_dict)
# выводим результат
print(f'Количество элементов в словаре kod_dict: {length}')

Проверка вхождения. Операторы in
и not in
проверяют наличие или отсутствие ключа, но не значения:
# присваиваем flag значение проверки вхождения ключа
flag = 'Михаил' in kod_dict
# выводим результат
print(f'Ключ "Михаил" есть в словаре: {flag}')
# присваиваем flag значение проверки отсутствия ключа
flag = 'Кирилл' not in kod_dict
print(f'Ключ "Кирилл" отсутствует: {flag}')

Слияние словарей. Словари нельзя складывать, но для этого есть другие операции. Если во втором словаре есть идентичные ключи, то в итоговом словаре значения будут браться именно из него:
# объявляем новый словарь
kod_dict1 = {'Кирилл': 'контент-менеджер', 'Алексей': 'художник', 'Михаил': 'главред'}
# проводим операцию слияния исходного словаря с новым
kod_dict = kod_dict | kod_dict1
# выводим результат
print(f'Словарь kod_dict после слияния со словарём kod_dict1: {kod_dict}')

Также доступен такой способ:
# проводим операцию слияния другим способом
kod_dict = {**kod_dict, **kod_dict1}
# выводим результат
print(f'Словарь kod_dict после слияния со словарем kod_dict1: {kod_dict}')
Сравнение словарей. Словари, как и списки, можно сравнивать между собой, но только на равенство, поскольку порядок элементов не фиксирован. Словари считаются равными, если они содержат одинаковое количество элементов и для каждой пары первого словаря есть такая же во втором.
# присваиваем переменной копию словаря
kod_dict2 = kod_dict.copy()
# выводим результат сравнения
print(kod_dict == kod_dict2)

Методы словарей
У словарей в Python есть несколько уникальных методов.
Метод .get возвращает значение по ключу. Если ключ не найден, Python выдаст результат None
. Чтобы не получать None
, нужно указать второй аргумент. Тогда будет возвращаться указанное значение:
# объявляем словарь
kod_dict = {'Михаил': 'главред', 'Абдурахман': 'автор', 'Ира': 'корректор'}
# выводим результат
print(f'Словарь kod_dict до изменений: {kod_dict}')
# запрашиваем должность Иры
role = kod_dict.get('Ира')
# выводим результат
print(f'Должность Иры: {role}')
# запрашиваем должность Максима
role = kod_dict.get('Максим', 'Максима нет в словаре')
# выводим результат
print(f'Должность Максима: {role}')

Метод .setdefault действует как метод .get
, но при отсутствии ключа добавляет его в словарь. Значением ключа будет второй аргумент, по умолчанию None
:
# запрашиваем значение
kod_dict.setdefault('Инна', 'шеф-редактор')
# выводим результат
print(f'Словарь kod_dict после применения метода .setdefault: {kod_dict}')

Метод .pop удаляет пару по указанному ключу и возвращает его значение:
# удаляем значение
del1 = kod_dict.pop('Инна')
print(f'Значение, удалённое из словаря: {del1}')
print(f'Словарь kod_dict после удаления пары с ключом "Инна": {kod_dict}')

Метод .popitem удаляет пару с конца словаря и возвращает её в виде кортежа «(ключ, значение)»:
# удаляем последнюю пару
del2 = kod_dict.popitem()
# выводим результат
print(f'Удалённая пара «ключ : значение»: {del2}')
print(f'Словарь kod_dict после удаления последней пары: {kod_dict}')

Метод .update действует как операция слияния словарей: добавляет новые пары и обновляет старые, если они встречаются в обоих словарях. В нашем примере ключ ‘Михаил’ содержится в обоих словарях, поэтому итоговое значение берётся из kod_dict1:
# объявляем новый словарь
kod_dict2 = {'Михаил': 'главный редактор', 'Ира': 'корректор'}
kod_dict.update(kod_dict2)
print(f'Словарь kod_dict после слияния со словарём kod_dict2: {kod_dict}')

Метод .keys возвращает объект класса dict_keys
, в котором хранятся все ключи словаря. Можно преобразовать в список для дальнейшей работы:
# создаём список из ключей словаря
kod_crew = list(kod_dict.keys())
# выводим результат
print(f'Список ключей словаря kod_dict: {kod_crew}')

Метод .values возвращает объект класса dict_values
, в котором хранятся все значения словаря. Извлекается так же легко:
# создаём список из значений словаря
kod_roles = list(kod_dict.values())
# выводим результат
print(f'Список значений словаря kod_dict: {kod_roles}')

Метод .items возвращает объект класса dict_items
, в котором хранятся все пары «ключ : значение» в виде кортежей. И здесь всё можно перевести в список:
# извлекаем пары из словаря в виде кортежей
kod_workers = list(kod_dict.items())
# выводим результат
print(f'Список кортежей «ключ : значение» словаря kod_dict: {kod_workers}')

Метод .fromkeys создаёт словарь с ключами из указанной последовательности и значениями None
по умолчанию. Если указать второй аргумент, он будет значением для всех ключей:
# объявляем словарь
kod_dict3 = dict.fromkeys(['Кристина', 'Игорь', 'Абдурахман'], 'автор')
# выводим результат
print(f'Словарь kod_dict3, созданный методом .fromkeys: {kod_dict3}')

Метод .copy создаёт копию словаря:
# копируем словарь
kod_dict3_copy = kod_dict.copy()
# выводим результат
print(f'Словарь kod_dict3_copy, созданный как копия словаря kod_dict3: {kod_dict3_copy}')

Метод .clear очищает словарь от всех элементов:
# очищаем все словари
kod_dict1.clear()
kod_dict2.clear()
kod_dict3.clear()
kod_dict3_copy.clear()
# выводим результат
print(f'Все словари очищены: {kod_dict1}, {kod_dict2}, {kod_dict3}, {kod_dict3_copy}')

Что дальше
Вы могли заметить, что все эти списки, кортежи и словари какие-то не такие — в том смысле, что это не массивы в классическом значении. В следующий раз мы поговорим о библиотеках array
и NumPy
, которые позволяют работать со стандартными массивами.