Расскажу о том, что такое словарь и как с ним работать.

Внимание! Эта статья для новичков, прям совсем новичков. Если вы матёрый программист и увидели неточность или неправильную интерпретацию терминов и хотите об этом рассказать, то это замечательно, но не надо. Это статья новичка для новичков, не бейте детей в их песочнице.

Иногда бывает ситуация, когда нужно задать сопоставление одного элемента другому. Вот случай из моей практики: есть медные трубопроводы, в Ревите у них размер в миллиметрах, а мне для спецификации нужно сформировать наименование в дюймах.

Следовательно, мне нужно соответствие миллиметрового размера и дюймового обозначения. Если диаметр трубы 12,7 мм, то это 1/2", если 15,88 мм, то 5/8" и так далее.

Вот для этих целей нам и пригодится словарь — инструмент для сопоставления значений. По словарю можно устроить поиск, и если найдётся одно значение, то получим на выход другое, которое ему соответствует.

Словари в Динамо

В Динамо применяются словари в некоторых нодах, например в ноде для фильтрации List.FilterByBoolMask и в ноде для сортировки по ключам List.SortByKey.

Если присмотреться к тому, как эти ноды выводят информацию, то окажется, что у каждого подсписка есть название.

Тут два заголовка: подсписки in и out
Тут два заголовка: подсписки in и out
Тут имена подлиннее: sorted list и sorted keys
Тут имена подлиннее: sorted list и sorted keys

Это знание может пригодиться, когда нам нужно с помощью Код Блока вызвать значение из вот такого именованного списка. Если пользоваться стандартным способом с вызовом по индексу, то ничего не выйдет. Если же указать имя списка, то всё получится.

Написал на Дизайн Скрипте код, который соответствует ноду фильтрации, и не смог выудить из него список со значениями
Написал на Дизайн Скрипте код, который соответствует ноду фильтрации, и не смог выудить из него список со значениями
Вызвал список по имени и получил его
Вызвал список по имени и получил его

В прошлой статье про индексы показывал, как найти людей определённого возраста. Эту же задачу можно решить с помощью словарей. Вот скриншот из статьи:

Создал два списка, сделал поиск по индексам, вывел список
Создал два списка, сделал поиск по индексам, вывел список

Сейчас посмотрим, как создавать словари в Динамо и Питоне и посмотрим на решение этой же задачи словарём.

Создание словарей

В Динамо

Самая первая группа нодов в Динамо 2.0 — это Dictionary, здесь собраны ноды для работы со словарями. Давайте посмотрим, что делает каждый нод, их тут всего 8 штук. Всего ноды начинаются со слова Dictionary, поэтому буду опускать его в именах нодов.

В правом нижнем углу — список нодов из библиотеки, по центру — те же ноды в скрипте, номера в списке и на ноде совпадают.
В правом нижнем углу — список нодов из библиотеки, по центру — те же ноды в скрипте, номера в списке и на ноде совпадают.
  1. ByKeysValues — нод для создания словаря. Подаёте список ключей и значений, получаем словарь. На картинке пример с именами и возрастом.
  2. Components — из словаря получаем два списка, первый — ключи, второй — значения. Аналог метода items() в Питоне, о чём будет в следующем подразделе статьи.
  3. RemoveKeys — подаёте словарь и ключи, на выходе получаете новый словарь, из которого удалены те ключи, которые вы подали. Само собой, вместе с ключами удаляются и соответствующие им значения. В примере подаю словарь и список имён людей, эти люди удаляются из словаря.
  4. SetValueAtKeys — подаёте словарь, список ключей и новые значения для этих ключей. Получаете новый словарь с изменёнными значениями у указанных ключей. В примере подаю словарь, список имён и список новых возрастов.
  5. ValueAtKey — подаёте словарь и ключи, получаете значение, которое соответствует этим ключам. В примере на скриншоте подаю словарь и список имён, получаю на выходе возраст.
  6. Count — считаем количество элементов в словаре.
  7. Keys — подаём словарь, получаем список ключей, в моём примере — имена людей.
  8. 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». Подписывайтесь и приглашайте коллег. Можно обсудить статью и задать вопросы в специальном чате канала.

Читайте методичку для проектировщиков: полезный материал, в котором последовательно рассказываю, как создавать модель.

Бесплатные обзоры ваших моделей

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

Отблагодарить автора

Я много времени уделяю блогу и разработке семейств. Если хотите отблагодарить меня, то можете сделать небольшой подарок (именно подарок, такой перевод не облагается налогом).