В этой статье расскажу, как использую индексы при работе в Динамо.
Начнём с простого определения. Индекс — порядковый номер элемента в строке или списке. Однако в программировании всё отсчитывается от нуля, поэтому индекс первого элемента, или первого вхождения, будет равен 0, а не 1.
Проще понять на примере. Вот у нас есть слово «динамо». Если проставить индексы всем буквам так, как это делают в программировании, то получится вот такая картина:
0 — д
1 — и
2 — н
3 — а
4 — м
5 — о
Букв в слове шесть, но отсчёт идёт от нуля, поэтому список индексов будет от 0 до пяти.
Элементы в списке тоже имеют свои индексы, и отсчёт тоже идёт от нуля.
![Индексы элементов в списках в красных прямоугольниках Индексы элементов в списках в красных прямоугольниках](https://muratovbim.pro/wp-content/uploads/2022/12/pub_5ffbed46bb14d54ffbad074e_5ffbf0e6f906b1687202889c.png)
Вот пример того, как можно пользоваться индексами. Есть у нас два списка как-то связанных элементов. Например, список с именами людей и список с их возрастом. Нужно получить список людей определённого возраста. Для этого можно получить из списка возрастом индексы подходящего возраста, а потом по этим индексам из списка имён получить нужных людей. Выглядеть это будет вот так:
![Скрипт для получения списка людей по индексам Скрипт для получения списка людей по индексам](https://muratovbim.pro/wp-content/uploads/2022/12/pub_5ffbed46bb14d54ffbad074e_5ffbf2cef906b168720506a5.png)
В нижней части скрипта с помощью нода List.AllIndicesOf — Список.ВсеИндексыДля — получаю индексы всех вхождений числа 20 в списке. Получаю 0, 2 и 5. И потом по этим индексам получаю имена из списка людей с помощью List.GetItemAtIndex — Список.ПолучитьЭлементПоИндексу. Получаю список «Дима», «Надя», «Олег». Если сравнить два исходных списка, то всё сходится: Диме, Наде и Олегу и правда по 20 лет.
Конечно, тот же результат можно получить с помощью фильтрации, об этом есть отдельная статья, но иногда работать с индексами удобнее, чем с фильтрами.
Также есть другие ноды для работы с индексами:
![Ноды для работы с индексами Ноды для работы с индексами](https://muratovbim.pro/wp-content/uploads/2022/12/pub_5ffbed46bb14d54ffbad074e_5ffbf739fe4e686f6a4c6a5e.png)
List.FirstIndexOf — Список.ПервыйИндексВхождения — нод пробегается по списку, как только найдёт первое совпадение, то выдаст индекс. Например, если подать на list список с буквами из слова «молоко», а на item подать "о", то нод выдаст значение 1, так как это индекс первой буквы «о» в списке. Остальные буквы «о» его не волнуют.
![Нод List.FirstIndexOf Нод List.FirstIndexOf](https://muratovbim.pro/wp-content/uploads/2022/12/pub_5ffbed46bb14d54ffbad074e_5ffbf7f2d1a90641ca1bd44f.png)
List.IndexOf — Список.ИндексВхождения — здесь мы подаём список и элемент, а нод вернёт индекс этого элемента в списке. Если элементов несколько, то индекс будет только для первого вхождения. То есть в чём-то этот нод напоминает всё тот же FirstIndexOf.
![Нод List.IndexOf Нод List.IndexOf](https://muratovbim.pro/wp-content/uploads/2022/12/pub_5ffbed46bb14d54ffbad074e_5ffbf86abb14d54ffbbb91b8.png)
List.RemoveItemAtIndex — Список.УдалитьЭлементПоИндексу — нод удаляет элемент из списка по значению индекса. В примере ниже получаю все индексы для букв «О» в списке из букв в слове «молоко», а затем удаляю буквы «О» по их индексам в списке.
![Нод List.RemoveItemAtIndex Нод List.RemoveItemAtIndex](https://muratovbim.pro/wp-content/uploads/2022/12/pub_5ffbed46bb14d54ffbad074e_5ffbf9befe4e686f6a4fffd2.png)
List.ReplaceItemAtIndex — Список.ЗаменитьЭлементПоИндексу — нод подставляет другое значение вместо элемента, чей индекс указан. К сожалению, работает только с одним индексом. Если подать несколько индексов, то нод выдаст несколько списков, в которых заменит по одному вхождению.
![Нод List.ReplaceItemAtIndex Нод List.ReplaceItemAtIndex](https://muratovbim.pro/wp-content/uploads/2022/12/pub_5ffbed46bb14d54ffbad074e_5ffbfa32fe4e686f6a5097c5.png)
![Нод не может заменить элементы сразу в одном списке Нод не может заменить элементы сразу в одном списке](https://muratovbim.pro/wp-content/uploads/2022/12/pub_5ffbed46bb14d54ffbad074e_5ffbfaa6f906b168720fe250.png)
Если нужно заменить сразу несколько значений, то тут проще написать код в Питоне.
List.SortIndexByValue — Список.СортироватьИндексыПоЗначению — нод работает только с числами. Берёт список чисел, упорядочивает по возрастанию и выдаёт индексы элементов из начального списка, но отсортированные так, чтобы идти по возрастанию. Если полученный список подать на нод List.GetItemAtIndex, то получим отсортированные числа.
![Нод List.SortIndexByValue Нод List.SortIndexByValue](https://muratovbim.pro/wp-content/uploads/2022/12/pub_5ffbed46bb14d54ffbad074e_5ffbfb85d1a90641ca20ed7e.png)
Для строк есть также несколько нодов, работают они аналогично, но со списком, а с текстом. Вот эти ноды на примере слова «МОЛОКО» и буквы «О». AllIndicesOf получает все индексы вхождений буквы в слово, IndexOf — индекс первого вхождения, а LastIndexOf — последнего вхождения.
![Ноды с индексами для работы со строками Ноды с индексами для работы со строками](https://muratovbim.pro/wp-content/uploads/2022/12/pub_5ffbed46bb14d54ffbad074e_5ffbfbf9bb14d54ffbc0a1c8.png)
Вот так работаю с индексами. Нельзя сказать, что в своей практике прям постоянно их использую, хотя при кодировании в Питоне сталкиваюсь с ними частенько.
Обновления статей удобно получать в Телеграм-канале «Блог Муратова про Revit MEP». Подписывайтесь и приглашайте коллег. Можно обсудить статью и задать вопросы в специальном чате канала.
Бесплатные обзоры ваших моделей
Раз в две недели провожу «Ревит-линчи» — разбираю файлы семейств и проектов пользователей и отвечаю на вопросы по Ревиту и БИМ-технологиям. Дату и ссылку на Ревит-линч публикую в Телеграм-канале. Приходите, там интересно.
Отблагодарить автора
Я много времени уделяю блогу. Если хотите отблагодарить меня, то можете сделать небольшой подарок (именно подарок, такой перевод не облагается налогом).