В этой статье расскажу, как использую индексы при работе в Динамо.

Начнём с простого определения. Индекс — порядковый номер элемента в строке или списке. Однако в программировании всё отсчитывается от нуля, поэтому индекс первого элемента, или первого вхождения, будет равен 0, а не 1.

Проще понять на примере. Вот у нас есть слово «динамо». Если проставить индексы всем буквам так, как это делают в программировании, то получится вот такая картина:

0 — д
1 — и
2 — н
3 — а
4 — м
5 — о

Букв в слове шесть, но отсчёт идёт от нуля, поэтому список индексов будет от 0 до пяти.

Элементы в списке тоже имеют свои индексы, и отсчёт тоже идёт от нуля.

Индексы элементов в списках в красных прямоугольниках
Индексы элементов в списках в красных прямоугольниках

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

Скрипт для получения списка людей по индексам
Скрипт для получения списка людей по индексам

В нижней части скрипта с помощью нода List.AllIndicesOf — Список.ВсеИндексыДля — получаю индексы всех вхождений числа 20 в списке. Получаю 0, 2 и 5. И потом по этим индексам получаю имена из списка людей с помощью List.GetItemAtIndex — Список.ПолучитьЭлементПоИндексу. Получаю список «Дима», «Надя», «Олег». Если сравнить два исходных списка, то всё сходится: Диме, Наде и Олегу и правда по 20 лет.

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

Также есть другие ноды для работы с индексами:

Ноды для работы с индексами
Ноды для работы с индексами

List.FirstIndexOf — Список.ПервыйИндексВхождения — нод пробегается по списку, как только найдёт первое совпадение, то выдаст индекс. Например, если подать на list список с буквами из слова «молоко», а на item подать "о", то нод выдаст значение 1, так как это индекс первой буквы «о» в списке. Остальные буквы «о» его не волнуют.

Нод List.FirstIndexOf
Нод List.FirstIndexOf

List.IndexOf — Список.ИндексВхождения — здесь мы подаём список и элемент, а нод вернёт индекс этого элемента в списке. Если элементов несколько, то индекс будет только для первого вхождения. То есть в чём-то этот нод напоминает всё тот же FirstIndexOf.

Нод List.IndexOf
Нод List.IndexOf

List.RemoveItemAtIndex — Список.УдалитьЭлементПоИндексу — нод удаляет элемент из списка по значению индекса. В примере ниже получаю все индексы для букв «О» в списке из букв в слове «молоко», а затем удаляю буквы «О» по их индексам в списке.

Нод List.RemoveItemAtIndex
Нод List.RemoveItemAtIndex

List.ReplaceItemAtIndex — Список.ЗаменитьЭлементПоИндексу — нод подставляет другое значение вместо элемента, чей индекс указан. К сожалению, работает только с одним индексом. Если подать несколько индексов, то нод выдаст несколько списков, в которых заменит по одному вхождению.

Нод List.ReplaceItemAtIndex
Нод List.ReplaceItemAtIndex
Нод не может заменить элементы сразу в одном списке
Нод не может заменить элементы сразу в одном списке

Если нужно заменить сразу несколько значений, то тут проще написать код в Питоне.

List.SortIndexByValue — Список.СортироватьИндексыПоЗначению — нод работает только с числами. Берёт список чисел, упорядочивает по возрастанию и выдаёт индексы элементов из начального списка, но отсортированные так, чтобы идти по возрастанию. Если полученный список подать на нод List.GetItemAtIndex, то получим отсортированные числа.

Нод List.SortIndexByValue
Нод List.SortIndexByValue

Для строк есть также несколько нодов, работают они аналогично, но со списком, а с текстом. Вот эти ноды на примере слова «МОЛОКО» и буквы «О». AllIndicesOf получает все индексы вхождений буквы в слово, IndexOf — индекс первого вхождения, а LastIndexOf — последнего вхождения.

Ноды с индексами для работы со строками
Ноды с индексами для работы со строками

Вот так работаю с индексами. Нельзя сказать, что в своей практике прям постоянно их использую, хотя при кодировании в Питоне сталкиваюсь с ними частенько.

Обновления статей удобно получать в Телеграм-канале «Блог Муратова про Revit MEP». Подписывайтесь и приглашайте коллег. Можно обсудить статью и задать вопросы в специальном чате канала.

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

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

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

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