Разбираемся с массивами в Python: словари
easy

Разбираемся с массивами в Python: словари

Легко сделать, сложно сломать и невозможно забыть

Продолжаем разбираться с массивами в 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: словари

Методы словарей

У словарей в 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}')
Разбираемся с массивами в Python: словари

Метод .setdefault действует как метод .get, но при отсутствии ключа добавляет его в словарь. Значением ключа будет второй аргумент, по умолчанию None:

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

Метод .pop удаляет пару по указанному ключу и возвращает его значение:

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

Метод .popitem удаляет пару с конца словаря и возвращает её в виде кортежа «(ключ, значение)»:

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

Метод .update действует как операция слияния словарей: добавляет новые пары и обновляет старые, если они встречаются в обоих словарях. В нашем примере ключ ‘Михаил’ содержится в обоих словарях, поэтому итоговое значение берётся из kod_dict1:

# объявляем новый словарь
kod_dict2 = {'Михаил': 'главный редактор', 'Ира': 'корректор'}
kod_dict.update(kod_dict2)
print(f'Словарь kod_dict после слияния со словарём kod_dict2: {kod_dict}')
Разбираемся с массивами в Python: словари

Метод .keys возвращает объект класса dict_keys, в котором хранятся все ключи словаря. Можно преобразовать в список для дальнейшей работы:

# создаём список из ключей словаря
kod_crew = list(kod_dict.keys())
# выводим результат
print(f'Список ключей словаря kod_dict: {kod_crew}')
Разбираемся с массивами в Python: словари

Метод .values возвращает объект класса dict_values, в котором хранятся все значения словаря. Извлекается так же легко:

# создаём список из значений словаря
kod_roles = list(kod_dict.values())
# выводим результат
print(f'Список значений словаря kod_dict: {kod_roles}')
Разбираемся с массивами в Python: словари

Метод .items возвращает объект класса dict_items, в котором хранятся все пары «ключ : значение» в виде кортежей. И здесь всё можно перевести в список:

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

Метод .fromkeys создаёт словарь с ключами из указанной последовательности и значениями None по умолчанию. Если указать второй аргумент, он будет значением для всех ключей:

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

Метод .copy создаёт копию словаря:

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

Метод .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}')
Разбираемся с массивами в Python: словари

Что дальше

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

Текст:

Абдурахман Гаджиев

Редактор:

Инна Долога

Обложка:

Алексей Сухов

Корректор:

Ирина Михеева

Вёрстка:

Мария Дронова

Соцсети:

Юлия Зубарева

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Вам может быть интересно
easy