Разбиение строки по списку индексов

Я хочу разбить строку на список индексов, где сегменты split начинаются с одного индекса и заканчиваются перед следующим.

Пример:

s = 'long string that I want to split up'
indices = [0,5,12,17]
parts = [s[index:] for index in indices]
for part in parts:
    print part

Это вернет:

длинная строка, которую я хочу разделить
строка, которую я хочу разделить что я хочу разделить Я хочу разделить

Я пытаюсь получить:

долго
строка
что
Я хочу разделить

Ответ 1

s = 'long string that I want to split up'
indices = [0,5,12,17]
parts = [s[i:j] for i,j in zip(indices, indices[1:]+[None])]

возвращает

['long ', 'string ', 'that ', 'I want to split up']

которую вы можете распечатать, используя:

print '\n'.join(parts)

Другая возможность (без копирования indices) будет:

s = 'long string that I want to split up'
indices = [0,5,12,17]
indices.append(None)
parts = [s[indices[i]:indices[i+1]] for i in xrange(len(indices)-1)]

Ответ 2

Вот короткое решение с интенсивным использованием модуля itertools. Функция tee используется для итерации по парам по индексам. Дополнительную информацию см. В разделе "Рецепт" в модуле.

>>> from itertools import tee, izip_longest
>>> s = 'long string that I want to split up'
>>> indices = [0,5,12,17]
>>> start, end = tee(indices)
>>> end.next()
0
>>> [s[i:j] for i,j in izip_longest(start, end)]
['long ', 'string ', 'that ', 'I want to split up']

Изменить. Это версия, которая не копирует список индексов, поэтому она должна быть быстрее.