Заменить указанный c символ в указанной c позиции без использования петель - Python - PullRequest
1 голос
/ 03 февраля 2020

Я пытаюсь заменить указанный c символ в указанной c позиции в строке.

Это необходимо выполнить без l oop и использования функций.

Вот пример - нужно заменить 5-й символ на x s = "0123456789012345689" Output needs to be - "01234x67890x23456x89" Я пробовал replace (), split (), но, возможно, я не использую их в правильном контексте. Строка может быть длиной n символов, поэтому я не могу жестко кодировать, где я получаю указанную позицию c и разбиваю их на подстроки. Строка должна быть неизменной в python, есть ли другие альтернативы?

Любая помощь будет оценена. Спасибо.

Ответы [ 3 ]

1 голос
/ 03 февраля 2020

Полагаю, если вы строго хотите избежать циклов, самый простой способ - это преобразование в список, замена элементов и обратное преобразование.

Это будет:

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 символов из исходной строки .

1 голос
/ 03 февраля 2020

Мое решение для этого было бы так:

def replace_position(message, replacement, n):
    lis = list(message)  # get a list of all characters.
    lis.pop(n)  # delete the chosen character from the list.
    lis.insert(n, replacement)  # replace it at the given position.

    return ''.join(lis)

Пример использования:

>>> a = 'Hello world, the 6th character is an x!'
>>> replace_postion(a, 'x', 6)
'Hello xorld, the 6th character is an x!'

Однако, это только первый в этой позиции. Для этого я бы сделал следующее:

def replace_position(message, replacement, n):
    lis = list(message)
    for i in range(n, len(message), n + 1):
        lis.pop(i)
        lis.insert(i, replacement)

    return ''.join(lis) 

Единственное отличие состоит в том, что теперь мы перебираем все сообщение и заменяем каждое из них, как go. Аналогичное использование:

>>> a = 'Hello world, every 6th character is an x!'
>>> replace_position(a, 'x', 6)
'Hello xorld, xvery 6xh charxcter ix an x!'

Надеюсь, это поможет.

0 голосов
/ 03 февраля 2020

Попробуйте

s = "01234567890123456789012345"

pieces = []
for i in range((len(s)-1)//5):
    pieces.append(s[i*6:i*6+5])

result = 'x'.join(pieces)

assert(result ==  '01234x67890x23456x89012x45')

Мы выполняем итерацию для каждого окна из шести символов в строке, а затем собираем первые пять символов в каждом окне. Затем мы объединяем все windows вместе, используя строку x в качестве разделителя.

Чтобы избежать использования циклов, вы можете преобразовать приведенное выше в понимание списка. Я оставлю этот шаг для вас, чтобы завершить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...