заменить значение 2-х массивов в Python String - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть строка и 2 массива, как показано ниже:

st="a1b2c3d"
arr1 = ['1','2','3']
arr2 = ['X','Y','Z']

Я хочу заменить все значения '1', '2', '3' на 'X', 'Y','Z'.Конечная строка будет выглядеть так:

'aXbYcZd'

Итак, я написал это для цикла:

for i in range(0, len(arr1)):
    st.replace(str(arr1[i]),str(arr2[i]))

Результат:

'aXb2c3d'
'a1bYc3d'
'a1b2cZd'

Как правильно делать то, чтоХочу выше?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 16 февраля 2019

Вызывая замену снова и снова означает, что вам нужно перебирать всю строку для каждой замены, то есть O (m * n).Вместо этого:

rep = dict(zip(arr1, arr2)) # make mapping, O(m)
result = ''.join(rep.get(ch, ch) for ch in st)

Первая строка - O (m), где m - длина arr1 и arr2.

Вторая строка - O (n), где n - длинаиз ст.

В целом это O (m + n) вместо O (m * n), что является значительным выигрышем, если либо m, либо n большое.

0 голосов
/ 16 февраля 2019

Если вы заменяете символы, вместо неэффективного цикла замены используйте str.translate с str.maketrans:

>>> table = str.maketrans('123', 'XYZ')
>>> result = 'a1b2c3d'.translate(table)
>>> result
'aXbYcZd'

maketrans требует 2 строки в качестве аргументов.Если у вас действительно есть список, вы можете использовать ''.join(l), чтобы превратить его в подходящую строку.Вам нужно составить таблицу только один раз.

Эффективность - только одно очко.str.translate - это способ сделать это правильно в тех случаях, когда вы отобразите a => b и b => что-то еще.Если вы хотите заменить строки , вам может понадобиться использовать re.sub.

0 голосов
/ 16 февраля 2019

Используйте zip(), чтобы выполнить итерацию по двум спискам одновременно для замены значений:

st = "a1b2c3d"
arr1 = ['1','2','3']
arr2 = ['X','Y','Z']

for x, y in zip(arr1, arr2):
    st = st.replace(x, y)

print(st)
# aXbYcZd

str.replace() не заменяет строку на месте.Вам необходимо присвоить возвращаемое значение обратно переменной.

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