#python #string #replace
#python #строка #заменить
Вопрос:
У меня есть строка say 'I have a string'
и список ['I', 'string']
. если мне нужно удалить все элементы в списке из заданной строки, соответствующий цикл for работает нормально. Но когда я пытаюсь сделать то же самое с пониманием списка, он работает не так, как ожидалось, но возвращает список.
my_string = 'I have a string'
replace_list = ['I', 'string']
for ele in replace_list:
my_string = my_string.replace(ele, '')
# results --> ' have a '
[my_string.replace(ele, '') for ele in replace_list]
# results --> [' have a string', 'I have a ']
Есть ли какой-либо способ сделать это более эффективно?
Ответ №1:
Используйте регулярное выражение:
import re
to_replace = ['I', 'string']
regex = re.compile('|'.join(to_replace))
re.sub(regex, '', my_string)
Вывод:
' have a '
В качестве альтернативы вы можете использовать reduce
:
from functools import reduce
def bound_replace(string, old):
return string.replace(old, '')
reduce(bound_replace, to_replace, my_string)
Вывод:
' have a '
Комментарии:
1. в качестве альтернативы вы можете использовать лямбда-выражение для замены вашей функции
reduce(lambda string,old: string.replace(old, ''),to_replace,my_string)
2. @AJS Я предпочитаю избегать лямбда-функций, где это возможно, потому что я нахожу синтаксис Python в этом отношении довольно неуклюжим.
3. да, это вопрос предпочтений.
4. Значит, в R нет какой-либо функции, подобной
str_replace_all()
?5. @SmashGuy Я не знаю R, но нет встроенной функции для замены нескольких произвольных подстрок. Есть
translate
для одиночных символов.