В этой статье расскажу, как использую индексы при работе в Динамо.
Начнём с простого определения. Индекс — порядковый номер элемента в строке или списке. Однако в программировании всё отсчитывается от нуля, поэтому индекс первого элемента, или первого вхождения, будет равен 0, а не 1.
Проще понять на примере. Вот у нас есть слово «динамо». Если проставить индексы всем буквам так, как это делают в программировании, то получится вот такая картина:
0 — д
1 — и
2 — н
3 — а
4 — м
5 — о
Букв в слове шесть, но отсчёт идёт от нуля, поэтому список индексов будет от 0 до пяти.
Элементы в списке тоже имеют свои индексы, и отсчёт тоже идёт от нуля.
Вот пример того, как можно пользоваться индексами. Есть у нас два списка как-то связанных элементов. Например, список с именами людей и список с их возрастом. Нужно получить список людей определённого возраста. Для этого можно получить из списка возрастом индексы подходящего возраста, а потом по этим индексам из списка имён получить нужных людей. Выглядеть это будет вот так:
В нижней части скрипта с помощью нода List.AllIndicesOf — Список.ВсеИндексыДля — получаю индексы всех вхождений числа 20 в списке. Получаю 0, 2 и 5. И потом по этим индексам получаю имена из списка людей с помощью List.GetItemAtIndex — Список.ПолучитьЭлементПоИндексу. Получаю список «Дима», «Надя», «Олег». Если сравнить два исходных списка, то всё сходится: Диме, Наде и Олегу и правда по 20 лет.
Конечно, тот же результат можно получить с помощью фильтрации, об этом есть отдельная статья, но иногда работать с индексами удобнее, чем с фильтрами.
Также есть другие ноды для работы с индексами:
List.FirstIndexOf — Список.ПервыйИндексВхождения — нод пробегается по списку, как только найдёт первое совпадение, то выдаст индекс. Например, если подать на list список с буквами из слова «молоко», а на item подать "о", то нод выдаст значение 1, так как это индекс первой буквы «о» в списке. Остальные буквы «о» его не волнуют.
List.IndexOf — Список.ИндексВхождения — здесь мы подаём список и элемент, а нод вернёт индекс этого элемента в списке. Если элементов несколько, то индекс будет только для первого вхождения. То есть в чём-то этот нод напоминает всё тот же FirstIndexOf.
List.RemoveItemAtIndex — Список.УдалитьЭлементПоИндексу — нод удаляет элемент из списка по значению индекса. В примере ниже получаю все индексы для букв «О» в списке из букв в слове «молоко», а затем удаляю буквы «О» по их индексам в списке.
List.ReplaceItemAtIndex — Список.ЗаменитьЭлементПоИндексу — нод подставляет другое значение вместо элемента, чей индекс указан. К сожалению, работает только с одним индексом. Если подать несколько индексов, то нод выдаст несколько списков, в которых заменит по одному вхождению.
Если нужно заменить сразу несколько значений, то тут проще написать код в Питоне.
List.SortIndexByValue — Список.СортироватьИндексыПоЗначению — нод работает только с числами. Берёт список чисел, упорядочивает по возрастанию и выдаёт индексы элементов из начального списка, но отсортированные так, чтобы идти по возрастанию. Если полученный список подать на нод List.GetItemAtIndex, то получим отсортированные числа.
Для строк есть также несколько нодов, работают они аналогично, но со списком, а с текстом. Вот эти ноды на примере слова «МОЛОКО» и буквы «О». AllIndicesOf получает все индексы вхождений буквы в слово, IndexOf — индекс первого вхождения, а LastIndexOf — последнего вхождения.
Вот так работаю с индексами. Нельзя сказать, что в своей практике прям постоянно их использую, хотя при кодировании в Питоне сталкиваюсь с ними частенько.
Обновления статей удобно получать в Телеграм-канале «Блог Муратова про Revit MEP». Подписывайтесь и приглашайте коллег. Можно обсудить статью и задать вопросы в специальном чате канала.
Бесплатные обзоры ваших моделей
Раз в две недели провожу «Ревит-линчи» — разбираю файлы семейств и проектов пользователей и отвечаю на вопросы по Ревиту и БИМ-технологиям. Дату и ссылку на Ревит-линч публикую в Телеграм-канале. Приходите, там интересно.
Отблагодарить автора
Я много времени уделяю блогу. Если хотите отблагодарить меня, то можете сделать небольшой подарок (именно подарок, такой перевод не облагается налогом).