Полагаю, если вы строго хотите избежать циклов, самый простой способ - это преобразование в список, замена элементов и обратное преобразование.
Это будет:
s = "0123456789012345689"
lst = list(s) # result: ['0', '1', '2', ..., '9']
lst[0:-1:5] = ["x"]*len(lst[0:-1:5])
Результат тогда:
In [43]: lst
Out[43]:
['x',
'1',
'2',
'3',
'4',
'x',
'6',
'7',
'8',
'9',
'x',
'1',
'2',
'3',
'4',
'x',
'6',
'8',
'9']
Чтобы вернуть его обратно в строку, вы просто используете соединение:
In [44]: "".join(lst)
Out[44]: 'x1234x6789x1234x689
Часть lst[0:-1:5]
выбирает каждый 5-й элемент в списке, начиная с с самой первой записью, обозначенной 0:
. Если вы хотите, чтобы он начинался с 5-го элемента , просто выполните lst[5:-1:5]
. Часть -1
означает «до конца», последний :5
означает «каждый пятый».
Необходимо присвоить значения с помощью ["x"]*len(lst[0:-1:5])
, поскольку "x"
здесь будет пытаться назначить один значение для фрагмента исходного списка длиной len(lst[0:-1:5])
, поскольку именно столько элементов мы выбрали в первую очередь.
EDIT : При повторном взгляде ожидаемый результат на самом деле заключается в изменении каждого 6-го символа, а не каждого 5-го (при сохранении 5 символов между измененными из исходной строки).
Тогда можно было бы, конечно, необходимо настроить нарезку для выбора каждого 6-го символа:
lst[5:-1:6] = ["x"]*len(lst[5:-1:6])
^ ^
Результат:
In [12]: "".join(lst)
Out[12]: '01234x67890x23456x9'
Теперь заменяется каждый шестой символ, сохраняя при этом 5 символов из исходной строки .