Не посещенные индексы вставки не изменятся, если вы выполните итерацию в обратном направлении. Это верно для всех таких проблем. Иногда он даже позволяет вам изменять последовательности во время итерации, если вы осторожны (не то, чтобы я когда-либо рекомендовал это).
Вы можете найти все точки вставки из dict, отсортировать их назад, а затем выполнить вставку , Например:
items = ['<span ...>', '</span>']
keys = ['startOffset', 'endOffset']
insertion_points = [(d[key], item) for d in indexes_list for key, item in zip(keys, items)]
insertion_points.sort(reverse=True)
for index, content in insertion_points:
main_str = main_str[:index] + content + main_str[index:]
Причина этого не в том, что это неэффективно. Для текста разумного размера это не большая проблема, но имейте в виду, что вы нарезаете и перераспределяете постоянно увеличивающуюся строку с каждым шагом.
Гораздо более эффективный подход будет разбивать всю строку один раз в все точки вставки. Добавление элементов списка в нужных местах с нужным контентом было бы намного дешевле, и вам нужно было бы воссоединиться с ним всего один раз:
items = ['<span ...>', '</span>']
keys = ['startOffset', 'endOffset']
insertion_points = [(d[key], item) for d in indexes_list for key, item in zip(keys, items)]
insertion_points.sort()
last = 0
chopped_str = []
for index, content in insertion_points:
chopped_str.append(main_str[last:index])
chopped_str.append(content)
last = index
chopped_str.append[main_str[last:]]
main_str = ''.join(chopped_str)