Словари
Списки — удобный и самый популярный способ сохранить большое количество данных в одной переменной. Списки индексируют все хранящиеся в них элементы. Первый элемент, как мы помним, лежит по индексу 0, второй — по индексу 1 и т. д. Такой способ хранения позволяет быстро обращаться к элементу списка, зная его индекс.
Представим, что мы делаем свою онлайн-энциклопедию об актерах мирового кино (наподобие Википедии). Для каждого актера нужно сохранить текст статьи о нем. Ее название — строка, состоящая из фамилии и имени актера. Как правильно хранить такие данные?
Можно создать список кортежей. Каждый кортеж будет состоять из двух строк — названия и текста статьи.
Со временем количество статей значительно вырастет. Чтобы найти нужную статью по названию, нам придется написать цикл for, который пройдет по всем элементам списка actors и найдет в нем кортеж, первый элемент которого равен искомому названию. В приведенном выше примере, чтобы найти статью об Эмме Уотсон, нам придется в цикле пройти мимо Джонни Деппа и Сильвестра Сталлоне. Угадать заранее, что статья об Эмме Уотсон лежит после них, не получится.
Корень этой проблемы в том, что списки индексируются целыми числами. Мы же хотим находить информацию не по числу, а по строке — названию статьи. Было бы здорово, если бы индексами могли быть не числа, а строки. В списках это невозможно, однако возможно в словарях!
Словарь (в Python он называется dict) — тип данных, позволяющий, как и список, хранить много данных. В отличие от списка, в словаре для каждого элемента можно самому определить «индекс», по которому он будет доступен. Этот индекс называется ключом.
Создание словаря
Вот пример создания словаря для энциклопедии об актерах мирового кино:
Элементы словаря перечисляются в фигурных скобках (как и элементы множества!) и разделяются запятой. До двоеточия указывается ключ, а после двоеточия — значение, доступное в словаре по этому ключу.
Пустой словарь можно создать двумя способами:
!!! note "Важно
Вспомните, что создать пустое множество можно, только используя функцию set(). Теперь понятно, почему это так — пустые фигурные скобки зарезервированы для создания словаря.
Обращение к элементу словаря
После инициализации словаря мы можем быстро получать статью про конкретного актера:
Обращение к элементу словаря выглядит как обращение к элементу списка, только вместо целочисленного индекса используется ключ. В качестве ключа можно указать выражение: Python вычислит его значение, прежде чем обратится к искомому элементу.
KeyError
Если обратиться к несуществующему ключу, Python выдаст ошибку KeyError:
Добавление и удаление элементов
Важная особенность словаря — его динамичность. Мы можем добавлять новые элементы, изменять их или удалять. Изменяются элементы точно так же, как в списках, только вместо целочисленного индекса в квадратных скобках указывается ключ:
Также в словари можно добавлять новые элементы и удалять существующие.
Добавление синтаксически выглядит так же, как и изменение:
Для удаления можно использовать инструкцию del (как и в списках):
Удалять элемент можно и по-другому:
Единственное отличие этого способа от вызова del — он возвращает удаленное значение. Можно написать так:
В переменную deleted_value положится значение, которое хранилось в словаре по ключу Джонни Депп. В остальном этот способ идентичен оператору del. В частности, если ключа Джонни Депп в словаре нет, возникнет ошибка KeyError.
Чтобы ошибка не появлялась, этому методу можно передать второй аргумент. Он будет возвращен, если указанного ключа в словаре нет. Это позволяет реализовать безопасное удаление элемента из словаря:
Если ключа Джонни Депп в словаре нет, в deleted_value попадет None.
Проверка наличия элемента в словаре
Оператор in позволяет проверить, есть ли ключ в словаре:
Проверить, что ключа нет, можно с помощью аналогичного оператора not in:
!!! tip "Подсказка
Оператор in для словарей проверяет наличие ключа, а не значения.
Методы словарей
get
Метод get позволяет получить значение по ключу безопасно — без риска KeyError. Если ключ отсутствует, возвращается None или указанное значение по умолчанию:
keys, values
Методы keys() и values() возвращают все ключи и все значения словаря соответственно. Их удобно преобразовывать в список:
items
Метод items() возвращает пары (ключ, значение) — это удобно для перебора словаря в цикле:
!!! info "Порядок элементов
Начиная с Python 3.7, словари сохраняют порядок добавления элементов. При переборе через items() элементы будут выводиться в том порядке, в котором они были добавлены.
Задачи
Задача 1
Считайте слово и выведите количество вхождений каждой буквы в формате буква: количество, по одной паре на строку, в порядке первого появления буквы в слове.
Тест 1:
Ввод:
Вывод:Задача 2
Считайте n строк вида имя оценка. Выведите имена и их оценки через :, каждую пару на новой строке.
Тест 1:
Ввод:
Вывод:Задача 3
Считайте n строк вида слово перевод. Затем считайте слово для перевода. Если слово есть в словаре — выведите перевод. Иначе выведите Слово не найдено.
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод:Задача 4
Считайте строку. Выведите наиболее часто встречающийся символ (не считая пробелов). Если таких символов несколько — выведите тот, который встречается первым.
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод:Задача 5
Считайте n строк вида товар цена. Затем считайте название товара. Выведите его цену. Если товар не найден — выведите Товар не найден.
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод:Задача 6
Считайте n строк вида имя оценка. Имена могут повторяться — тогда нужно суммировать оценки. Выведите все имена и суммы оценок в порядке первого появления имени.
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод:Задача 7
Считайте два списка слов (каждый до пустой строки). Выведите слова, которые есть в первом списке, но отсутствуют во втором, в порядке их появления в первом списке.
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод:Задача 8
Считайте строку. Подсчитайте, сколько раз встречается каждое слово. Выведите все слова и их количество в порядке первого появления, в формате слово: количество. Регистр не учитывается (приводите слова к нижнему регистру).
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод:Задача 9
Считайте n строк — оценки учеников в формате имя оценка. Выведите имя ученика с наибольшей оценкой. Если таких несколько — выведите того, чьё имя встречается первым.
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод:Задача 10
Считайте n строк, каждая содержит два слова через пробел — оригинал и перевод. Затем считайте текст (одну строку). Замените каждое слово из текста его переводом, если оно есть в словаре, и выведите результат. Слова, которых нет в словаре, оставьте без изменений.
Тест 1:
Ввод:
Вывод:Тест 2:
Ввод:
Вывод: