Расскажу о том, что такое словарь и как с ним работать.
Внимание! Эта статья для новичков, прям совсем новичков. Если вы матёрый программист и увидели неточность или неправильную интерпретацию терминов и хотите об этом рассказать, то это замечательно, но не надо. Это статья новичка для новичков, не бейте детей в их песочнице.
Иногда бывает ситуация, когда нужно задать сопоставление одного элемента другому. Вот случай из моей практики: есть медные трубопроводы, в Ревите у них размер в миллиметрах, а мне для спецификации нужно сформировать наименование в дюймах.
Следовательно, мне нужно соответствие миллиметрового размера и дюймового обозначения. Если диаметр трубы 12,7 мм, то это 1/2", если 15,88 мм, то 5/8" и так далее.
Вот для этих целей нам и пригодится словарь — инструмент для сопоставления значений. По словарю можно устроить поиск, и если найдётся одно значение, то получим на выход другое, которое ему соответствует.
Словари в Динамо
В Динамо применяются словари в некоторых нодах, например в ноде для фильтрации List.FilterByBoolMask и в ноде для сортировки по ключам List.SortByKey.
Если присмотреться к тому, как эти ноды выводят информацию, то окажется, что у каждого подсписка есть название.
Это знание может пригодиться, когда нам нужно с помощью Код Блока вызвать значение из вот такого именованного списка. Если пользоваться стандартным способом с вызовом по индексу, то ничего не выйдет. Если же указать имя списка, то всё получится.
В прошлой статье про индексы показывал, как найти людей определённого возраста. Эту же задачу можно решить с помощью словарей. Вот скриншот из статьи:
Сейчас посмотрим, как создавать словари в Динамо и Питоне и посмотрим на решение этой же задачи словарём.
Создание словарей
В Динамо
Самая первая группа нодов в Динамо 2.0 — это Dictionary, здесь собраны ноды для работы со словарями. Давайте посмотрим, что делает каждый нод, их тут всего 8 штук. Всего ноды начинаются со слова Dictionary, поэтому буду опускать его в именах нодов.
- ByKeysValues — нод для создания словаря. Подаёте список ключей и значений, получаем словарь. На картинке пример с именами и возрастом.
- Components — из словаря получаем два списка, первый — ключи, второй — значения. Аналог метода items() в Питоне, о чём будет в следующем подразделе статьи.
- RemoveKeys — подаёте словарь и ключи, на выходе получаете новый словарь, из которого удалены те ключи, которые вы подали. Само собой, вместе с ключами удаляются и соответствующие им значения. В примере подаю словарь и список имён людей, эти люди удаляются из словаря.
- SetValueAtKeys — подаёте словарь, список ключей и новые значения для этих ключей. Получаете новый словарь с изменёнными значениями у указанных ключей. В примере подаю словарь, список имён и список новых возрастов.
- ValueAtKey — подаёте словарь и ключи, получаете значение, которое соответствует этим ключам. В примере на скриншоте подаю словарь и список имён, получаю на выходе возраст.
- Count — считаем количество элементов в словаре.
- Keys — подаём словарь, получаем список ключей, в моём примере — имена людей.
- Values — подаём словарь, получаем список значений, в моём примере — возраст людей.
Чтобы создать словарь в Код Блоке, нужно поставить фигурные скобки, написать в кавычках имя списка, поставить двоеточие и указать значения.
В словарь можно помещать разные данные, не только одиночные текстовые значения, но и числа или списки, в том числе многоуровневые. Чтобы получить из словаря значение, нужно обратиться к нему по ключу, а потом указать индексы нужных элементов, вот так:
Как часто вы будете пользоваться стандартными нодами или Код Блоком, зависит от вас и задачи, делайте, как удобно.
В Питоне
Здесь синтаксис такой же — {ключ : значение}, но вместо имени словаря будет переменная, в которую мы этот словарь поместим.
dictionary = {ключ : значение} — вот переменная dictionary, в неё записаны данные.
Разница с Динамо в том, что в Питоне нам обычно нужно «заходить» в списки циклами и применять разные методы к словарю, чтобы извлекать данные. Это тема для отдельной статьи по Питону, поэтому лучше почитайте вот этот материал про словари, он достаточно понятный, если вы в принципе хоть как-то знакомы с языком Питона.
Я же покажу примеры решение задачи с именами и некоторые методы.
Важно. Ключи должны быть уникальными, иначе данные будут перезаписываться. В Динамо ключом может быть только текстовое значение, а в Питоне — только неизменяемые типы данных. Подробнее об этом можете прочитать вот по этой ссылке, там рассказывают про изменяемые и неизменяемые типы данных.
Если кратко: текст, числа, кортежи (фиксированные списки) неизменяемы, а словари и списки — изменяемы. В словарь или список вы можете добавить/удалить данные, и они останутся всё теми же объектами, просто изменёнными. Если меняете число или строку, то это уже новый объект для Питона, то есть объект не изменяется, а по сути создаётся заново, даже если выглядит для нас по-старому.
Решение задачи с именами и возрастом
В Динамо
Здесь задачу можно решить двумя путями. В первом в результате будет просто список имён, а во втором — словарь.
Первый способ.
У этого способа есть один минус. Если изначально в виде данных к вам поступают два списка, а не словарь, то нет смысла использовать словарь — можно просто обработать два списка и всё. Поэтому следующий способ будет лучше с точки зрения работы со словарями.
Второй способ.
Тут всё выглядит посложнее, но преимущество метода в том, что на выходе мы имеем опять словари, а значит изначальная структура данных осталась и можно вновь её обрабатывать как словарь, а не просто список.
В группе 2 используется нод List.Map. Он делает следующее: берёт список, который мы подаём на вход «list» и применяет к нему функцию, которую подаём на вход «f(x)». В данном случае функция — это не математическая функция типа y = x², а нод. В нашем случае нод для создания словаря.
Что происходит. На нод для создания словаря мы подаём список ключей: «Имя» и «Возраст». Этот нод мы подаём на List.Map, а на вход «list» подаём наши списки с именами и возрастами. List.Map применяет нод словаря к каждому списку с человеком и его возрастом, в итоге получается список из словарей.
То же самое можно было сделать изменением уроня списка на входе «values» нода Dictionary.ByKeysValues. В этом случае происходит аналогичная операция, нод берёт ключи и попеременно применяет их к каждому подсписку, в который мы провалились на уровень @L2. Подробнее про списки и их уровни читайте в отдельной статье блога.
В Питоне
Посмотрим, как получить список имён. Создаём переменную, в неё назначаем словарь, в котором через запятую идут пары ключ-значение. Ключи — имена, значения — возрасты.
Далее создаю пустой список outlist — в него запишу искомые значения и выведу из нода Питон Скрипта.
Потом циклом FOR прохожусь словарю. Тут работает метод словарь.items() — он возвращает из словаря отдельные пары ключей и значений. Вместо «словарь» надо писать имя переменной, в которой хранится ваш словарь. Пары значений нужно куда-то записать, поэтому создаю переменные name — для ключей, в нашем случае это имена людей, и age — для значений, в нашем случае — возраст.
Грубо говоря: метод items потрошит словарь и возвращает отдельно список с ключами и отдельно — со значениями.
Затем сравниваю значение возраста с числом 20, если они равны, то заношу имя человека в список и этот список подаю на выход Питон Скрипта. Всё.
Внутри Динамо на выход OUT нельзя подать словарь, только списки. Из-за этого сразу выдать словари не получится, в любом случае придётся потом обрабатывать списки и превращать в словарь.
Конечно, эта тема с Питоном не для новичков в программировании, но на будущее имейте в виду такую возможность. Если есть какой-то список, который соответствует другому списку, то удобнее пользоваться словарём.
Пример работы со словарями
Записал видеоролик: получаю с систем воздуховодов потери давления и записываю их в семейства вентустановок.
Если нужна помощь с Динамо и Питоном, то приходите в Телеграм-группу https://t.me/dynamochat.
Обновления статей удобно получать в Телеграм-канале «Блог Муратова про Revit MEP». Подписывайтесь и приглашайте коллег. Можно обсудить статью и задать вопросы в специальном чате канала.
Читайте методичку для проектировщиков: полезный материал, в котором последовательно рассказываю, как создавать модель.
Бесплатные обзоры ваших моделей
Раз в две недели провожу «Ревит-линчи» — разбираю файлы семейств и проектов пользователей и отвечаю на вопросы по Ревиту и БИМ-технологиям. Дату и ссылку на Ревит-линч публикую в Телеграм-канале. Приходите, там интересно.
Отблагодарить автора
Я много времени уделяю блогу и разработке семейств. Если хотите отблагодарить меня, то можете сделать небольшой подарок (именно подарок, такой перевод не облагается налогом).