Список замены строк в Python
Есть ли более короткий способ написать следующий код?
my_string = my_string.replace('A', '1')
my_string = my_string.replace('B', '2')
my_string = my_string.replace('C', '3')
my_string = my_string.replace('D', '4')
my_string = my_string.replace('E', '5')
Обратите внимание, что мне не нужны эти точные значения; Я просто ищу способ превратить 5+ строк менее 5
Ответы
Ответ 1
Похож на хорошую возможность использовать цикл:
mapping = { 'A':'1', 'B':'2', 'C':'3', 'D':'4', 'E':'5'}
for k, v in mapping.iteritems():
my_string = my_string.replace(k, v)
Более быстрый подход, если вы не возражаете против круглых скобок:
mapping = [ ('A', '1'), ('B', '2'), ('C', '3'), ('D', '4'), ('E', '5') ]
for k, v in mapping:
my_string = my_string.replace(k, v)
Ответ 2
Вы можете легко использовать string.maketrans() для создания строки отображения для перехода к str.translate():
import string
trans = string.maketrans("ABCDE","12345")
my_string = my_string.translate(trans)
Ответ 3
Также просмотрите str.translate()
. Он заменяет символы в соответствии с отображением, которое вы указываете для строк Unicode, или иначе должно быть сказано, что заменить каждый символ от chr (0) до chr (255) с помощью.
Ответ 4
Если вы хотите получить неверный ответ, медленно, то используйте string.replace в цикле. (Несмотря на то, что в этом случае он не работает с перекрытием между шаблонами и заменами.)
В общем случае с возможными перекрытиями или длинной предметной строкой используйте re.sub:
import re
def multisub(subs, subject):
"Simultaneously perform all substitutions on the subject string."
pattern = '|'.join('(%s)' % re.escape(p) for p, s in subs)
substs = [s for p, s in subs]
replace = lambda m: substs[m.lastindex - 1]
return re.sub(pattern, replace, subject)
>>> multisub([('hi', 'bye'), ('bye', 'hi')], 'hi and bye')
'bye and hi'
Для специального случая 1-символьных шаблонов и замены 1 или 0 символов используйте string.maketrans.
Ответ 5
replaceDict = {'A':'1','B':'2','C':'3','D':'4','E':'5'}
for key, replacement in replaceDict.items():
my_string = my_string.replace( key, replacement )
Ответ 6
Один из способов сделать это с помощью связанного массива (словаря). Ниже приведен пример замены, которую я использую, когда файл готов к развертыванию в LaTeX с использованием регулярных выражений.
import re
def escapeTexString(string): # Returns TeX-friendly string
rep = { # define desired replacements in this dictionary (mapping)
'&': '\\&',
'%': '\\%',
'#': '\\#',
'_': '\\_',
'{': '\\{', # REGEX Special
'}': '\\}', # REGEX Special
'~': '\\char"007E{}', # LaTeX Special
'$': '\\$', # REGEX Special
'\\': '\\char"005C{}', # REGEX/LaTeX Special
'^': '\\char"005E{}', # REGEX/LaTeX Special
'"': '\\char"FF02{}'
}
# use these two lines to do the replacement (could be shortened to one line)
pattern = re.compile("|".join(map(re.escape,rep.keys()))) # Create single pattern object (key to simultaneous replacement)
new_string = pattern.sub(lambda match: rep[match.group(0)], string)
return new_string
Ответ 7
Я думаю, что это может быть немного более эффективным:
mapping = { 'A':'1', 'B':'2', 'C':'3', 'D':'4', 'E':'5'}
my_string = "".join([mapping[c] if c in mapping else c for c in my_string])
Я предлагаю некоторый тест с "timeit", с реальными случаями в основании длины "my_string".