Вложенные словари
В качестве значения ключа словаря может выступать любой объект: число, строка, список или словарь. Вложенные коллекции часто используются для структурирования данных. Рассмотрим пример: словарь из списков, описывающий содержание пеналов учеников класса 1б:
Используя такую структуру очень просто отвечать на вопросы типа: «Что в пенале у Миши?», «У кого больше всего предметов в пенале?»:
Если нам не важен порядок предметов, уложенных в пинал, но важно уметь быстро и удобно получить число предметов данного типа, то удобнее представить пенал в виде словаря, где ключом будет название предмета, а значением — его количество. В качестве такого словаря будем использовать специальную разновидность словарей из стандартной библиотеки — collections.Counter (см. предыдущий семинар).
Теперь мы можем очень просто выяснить ответы на другие вопросы, например: «Какого предмета больше всего у Ксюши?» или «Сколько ластиков у Миши?».
Обратите внимание, что для несуществующих в Counter ключей значение равно нулю.
Предположим, что мы хотим добавить ещё какой-то предмет в чей-то пенал, указав имя ученика и название предмета.
Обратите внимание, что для несуществующих в Counter ключей оператор += тоже работает.
Усложним задачу, пусть теперь, если используется имя ученика, которого ещё нет в словаре, то его нужно добавить. Ниже приводится несколько реализаций функции, которая делает такое обновление словаря, в порядке улучшения качества кода.
В последнем примере используется метод словаря .setdefault(key, default) . Этот метод возвращает значение словаря по ключу key , а если такого ключа ещё нет, то добавляет в словарь пару key: default и возвращает default .
collections.defaultdict
Интуиция
defaultdict — это такой словарь, который старается сам правильно обработать отсутствие ключа в словаре.
Обычно мы сообщаем ему, какого типа должно по умолчанию быть значение, соответствующее ключу.
Зная поумолчальный тип значений, defaultdict , будет заводить тривиальное значение этого типа каждый раз, когда мы будем обращаться к ключу, которого на момент обращения нет в словаре.
В таком случае мы не получим ошибку KeyError (такого ключа в словаре нет) , а сразу увидим значение, о котором подсуетился defaultdict .
тривиальное значение какого-то типа тут – что-то максимально простое для этого типа. Для целых чисел – 0, для нецелых – 0.0, для строк – пустая строка, для списков – пустой список.
Пример использования
defaultdict обычно нужен там, где для обычного словаря вам пришлось бы писать
вместо этого можно написать
lists comprehension (демо-версия)
это удобный способ сокращать создание или заполнение списков. Он иногда будет появляться в примерах для экономии места, поэтому честно о нём рассказать.
О дебаггинге lists comprehension
В одной строке оказываются несколько разных действий. Поэтому информация о том, что ошибка произошла в строке с list comprehension, более неоднозначна, чем то же про обычную строку.
Если что-то не работает в строке с list comprehension, сразу переписывайте её без list comprehension и чините логику в “развёрнутом” виде, а потом сворачивайте обратно когда убедитесь, что с логикой всё ок.
Основная идея
можно записать так:
вложенность обрабатывается слева направо:
csv.DictReader
Отличный способ читать csv. Авторский конспект на подходе, временно ссылка на подходящий.
Домашнее задание
больше, чем обычно, и на подольше
Вам нужно написать программу, которая загадывает персонажей “Звёздных войн”. Загадав персонажа, программа показывает подсказку в виде частотного биграммного словосочетания из реплик этого персонажа, и ждёт ответа пользователя, после чего сообщает, угадал он или нет. Например, если загадан персонаж «THREEPIO», можно показать подсказку «Master Luke». Реплики персонажей нужно брать из сценариев ЗВ, ссылка на страницу датасета сценариев.
Пользователь может попросить подсказку. Тогда нужно выдать в ответ какую-то (если есть) информацию о загаданном персонаже из датасета2 ссылка на страницу датасета базы знаний ЗВ.
В задании обязательно использовать словарь. Когда читаете csv, используйте DictReader.
Вложенные словари в Python
Вложенный словарь означает dictionary в словаре. В паре «key:value» dictionary может занимать место value.
Ниже приводится простой пример вложенного словаря в Python глубины два:
В этом руководстве мы узнаем, как создать вложенный словарь, получить доступ к элементам в более глубоких словарях.
Как создать?
В следующей программе мы создали и распечатали вложенный словарь и значение, соответствующее ключу. Кроме того, мы подтвердили типы внешнего словаря и внутреннего словаря, распечатав тип в выводе консоли.
Доступ к внутренним элементам
Доступ к значениям из вложенного словаря аналогичен доступу к элементам многомерного массива, где размерность массива переводится в глубину вложенного словаря.
В предыдущем примере мы создали вложенный словарь глубины два. В следующей программе мы получим доступ к значению из этого словаря с помощью клавиши moo.
Как прочитать словарь в словаре?
Такое работает только в библиотеках, например Pandas , которые автоматически делают у объекта поля, к которым можно обращаться и так df[‘field’] и так df.field , с обычными словарями это не работает, к ним надо обращаться через индексирование (квадратные скобки):
Если известно, что ключ есть, но не известно, где он, то можно поиском по словарю пройтись в таком виде:
Или через метод get()
Есть некоторое отличие от данной d["ans"]. конструкции. Например, не выкидывает исключение, если не найден ключ. Но выкинет исключение, если не существует ключ в середине директивы. Например,
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.11.43304
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Добавить словарь в словарь на Python
Словарь в Python представляет собой группу элементов в виде пар ключ-значение. Это неупорядоченная и изменяемая коллекция.
В этом руководстве мы обсудим различные методы добавления словаря к другому словарю в Python.
Используйте метод update() , чтобы добавить словарь в другой словарь на Python
Метод update() соединяет один словарь с другим словарем. Используя этот метод, мы можем вставлять пары ключ-значение из одного словаря в другой словарь.
В приведенном выше коде мы объединили словари D1 и D2 с помощью метода update() .
Обратите внимание, что в этом методе первый словарь обновляется значениями второго словаря. В нашем примере обновился D1.
Используйте оператор распаковки словаря ** , чтобы добавить словарь в другой словарь на Python
Мы можем добавить два словаря в Python и сохранить их комбинацию в третьем словаре, используя оператор распаковки словаря ** . Этот метод не изменяет пары ключ-значение исходного словаря.