Я бы сделал это с islices поверх итератора исходного списка. Таким образом, я могу просто указать количество элементов, чтобы не беспокоиться о том, в какой позиции я сейчас нахожусь. (Кроме того, следующий код работает с любой итерацией.)
def increasing_chunks(iterable):
it = iter(iterable)
i = 1
while True:
chunk = list(islice(it, i))
if not chunk:
break
yield chunk
i += 1
Последний кусок может быть обрезан до любого количества элементов, оставленных итератором.
Демо-версия:
>>> list(increasing_chunks([1, 2, 3, 4, 5, 6]))
[[1], [2, 3], [4, 5, 6]]
>>> list(increasing_chunks([1, 2, 3, 4, 5, 6, 7, 8]))
[[1], [2, 3], [4, 5, 6], [7, 8]]
Если вы хотите удалить усеченные куски, измените код следующим образом:
def increasing_chunks_strict(iterable):
it = iter(iterable)
i = 1
while True:
chunk = list(islice(it, i))
if len(chunk) < i:
break
yield chunk
i += 1
Теперь усеченные куски не включаются в результат.
>>> list(increasing_chunks_strict([1, 2, 3, 4, 5, 6]))
[[1], [2, 3], [4, 5, 6]]
>>> list(increasing_chunks_strict([1, 2, 3, 4, 5, 6, 7, 8]))
[[1], [2, 3], [4, 5, 6]]