Вот реализация вашей гипотетической функции cut
.
def cut(line, cuts):
return ''.join(line[slice(keep_start, keep_end)]
for keep_start, keep_end in zip(
[None] + [cut_end for cut_start, cut_end in cuts],
[cut_start for cut_start, cut_end in cuts] + [None]))
print(cut('abcdefghijklmnopqrstuvwxyz', [[1,3], [9,10]]))
дает:
adefghiklmnopqrstuvwxyz
(bc
и j
были вырезаны)
Итак:
- сохраняемый фрагмент идет от начала до начала первого разреза,
- фрагмент, который нужно сохранить, идет от конца первого разреза к началу второго разреза
- ...
- последний кусок, который нужно сохранить, идет от конца последнего разреза до конца строки
[None] + [cut_end for cut_start, cut_end in cuts]
- начало каждого сохраняемого фрагмента, в этом примере [None, 3, 10]
[cut_start for cut_start, cut_end in cuts] + [None]
- это конец каждого фрагмента, который необходимо сохранить, в этом примере [1, 9, None]
где None
означает начало / конец строки, используемой встроенной функцией slice
.
Примечание: для реализации сокращений, приведенных в вашем примере, вы должны предоставить аргументы этой cut
функции как:
cut(line, [[84, 89], [1519, 1526]])
, где второй элемент каждого двухэлементного списка является индексом после конца разреза в соответствии с обычными python соглашениями об индексировании.
Если вы действительно хотите, чтобы не приходилось делать это (чтобы получить точно функцию cut
, которую вы описали выше), то в приведенном выше коде вы замените:
[cut_end for cut_start, cut_end in cuts]
на:
[cut_end + 1 for cut_start, cut_end in cuts]
Для удобства здесь - это полный код функции в этом случае и вызывающий код, который вы использовали бы в своем примере:
def cut(line, cuts):
return ''.join(line[slice(keep_start, keep_end)]
for keep_start, keep_end in zip(
[None] + [cut_end + 1 for cut_start, cut_end in cuts],
[cut_start for cut_start, cut_end in cuts] + [None]))
print(cut(line, [[84, 88], [1519, 1525]])