Cide делает три копии массива: [0] + индексы копируют ([0] + индексы) + [] копирует снова, а индексы [: - 1] копируют в третий раз. Ил-Бхима составляет пять экземпляров. (Я не считаю возвращаемое значение, конечно.)
Эти могут быть уменьшены (izip, islice), но вот версия с нулевой копией:
def iterate_pairs(lst, indexes):
prev = 0
for i in indexes:
yield prev, i
prev = i
yield prev, len(lst)
def partition(lst, indexes):
for first, last in iterate_pairs(lst, indexes):
yield lst[first:last]
indexes = [5, 12, 17]
lst = range(20)
print [l for l in partition(lst, indexes)]
Of Конечно, копии массивов довольно дешевы (собственный код) по сравнению с интерпретированным Python, но это имеет еще одно преимущество: его легко повторно использовать, чтобы напрямую мутировать данные:
for first, last in iterate_pairs(lst, indexes):
for i in range(first, last):
lst[i] = first
print lst
# [0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 12, 12, 12, 12, 12, 17, 17, 17]
(Вот почему я передал индексы iterate_pairs.Если вас это не волнует, вы можете удалить этот параметр и просто иметь окончательную строку: «yield prev, None», который нужен всем разделам ().)