Обратите внимание, что old
не должен быть аргументом вашей функции, так как вам нужно только len(old)
здесь.Вам нужно либо old
, либо indices
+ len
, но не оба.
Однострочник (я взял пример из ответа TigerHawkT3):
>>> s, inds, old, new = 'hi this is a this string of this', [3, 13, 28], 'this', 'other'
>>> new.join(s[slice(*ij)] for ij in zip([None]+[i+len(old) for i in inds], inds+[None]))
'hi other is a other string of other'
Пояснение. Вы хотите заменить s[inds[i]:inds[i]+len(old)]
на new
в s
, то есть оставить все фрагменты s[inds[i-1]+len(old):inds[i]]
и заполнить пробелы new
.Это просто new.join
.Как построить куски?[i+len(old) for i in inds]
- это начальные индексы, inds
- это конечные индексы:
>>> list(zip([i+len(old) for i in inds], inds))
[(7, 3), (17, 13), (32, 28)]
Вы видите, что мы должны сместить начальные индексы, чтобы получить правильные срезы.Мы хотим:
[(None, 3), (7, 13), (17, 28), (32, None)]
(None
означает 0
для начального индекса и len(s)
для конечного индекса).Просто вставьте None
перед начальными индексами, а в конце конечных индексов:
zip([None]+[i+len(old) for i in inds], inds+[None])
Все остальное очевидно, поскольку slice(*ij)
является срезом ij[0]:ij[1]
.
Это забавно, но (есть , но ) Я не думаю, что это питон:
>>> import this
The Zen of Python, by Tim Peters
...
Readability counts.
...
If the implementation is hard to explain, it's a bad idea.
...