Python: заменить один символ несколькими значениями. - PullRequest
0 голосов
/ 18 июня 2020

У меня есть строка с "?" как заполнители. Мне нужно l oop через строку и заменить каждый "?" со следующим значением в списке.

Например:

my_str = "Take the source data from ? and pass to ?;"
params = ['temp_table', 'destination_table']

Вот то, что я пробовал, и это работает:

params_counter = 0
for letter in my_str:
    if letter == '?':
        # Overwrite my_str with a new version, where the first ? is replaced
        my_str = my_str.replace('?', params[params_counter], 1)
        params_counter += 1

Проблема в том, что кажется довольно медленно до l oop через каждую букву в строке несколько раз. Мой пример - простая строка, но в реальных ситуациях могут быть строки намного длиннее.

Какие более элегантные или эффективные способы выполнить sh это?

Я видел этот вопрос , который относительно похож , но они используют словари и заменяют несколько значений несколькими значениями, а не мой случай, когда одно значение заменяется несколькими значениями.

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

вам не нужно повторять, replace заменит первое вхождение строки:

умное решение состоит в том, чтобы разделить строку, которую вы ищете, а затем заархивировать список со списком замен длина такая же, а затем объединение

list1 = my_str.split('?')
params = ['temp_table', 'destination_table']
zipped = zip(list1, params)
replaced = ''.join([elt for sublist in zipped for elt in sublist])

In [19]: replaced                                                               
Out[19]: 'Take the source data from temp_table and pass to destination_table'

Вы можете использовать строки из нескольких символов, что убьет ваш метод:

my_str = "Take the source data from magicword and pass to magicword;
list1 = my_str.split('magicword') 
params = ['temp_table', 'destination_table'] 
zipped = zip(list1, params)
replaced = ''.join([elt for sublist in zipped for elt in sublist]) 
In [25]: replaced                                                               
Out[25]: 'Take the source data from temp_table and pass to destination_table'

Обратите внимание, что если ваши параметры короче, чем количество вхождения вашей строки поиска, это обрежет ее

IN []my_str = "Take the source data from ? and pass to ?; then do again with ? and to ?"
Out[22]: 'Take the source data from temp_table and pass to destination_table'

Также обратите внимание, что последний бит после поиска строки удаляется :(, что-то вроде

replaced = ''.join([elt for sublist in zipped for elt in sublist] + [list1[-1]])

Подойдет

1 голос
/ 18 июня 2020

Хотя @E. Ответ Серры - отличный ответ, комментарий от @jasonharper заставил меня понять, что есть НАМНОГО более простой ответ. Настолько невероятно просто, что я удивлен, что полностью пропустил это!

Вместо того, чтобы перебирать строку, я должен oop перебирать параметры. Это позволит мне заменить первый экземпляр "?" с текущим параметром, на который я смотрю. Затем я перезаписываю строку, позволяя ей правильно выполнить на следующей итерации.

В отличие от другого опубликованного решения, оно также не обрезает конец моей строки.

my_str = "Take the source data from ? and pass to ?;"
params = ['temp_table', 'destination_table']

for item in params:
    query_str = query_str.replace('?', item, 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...