Список замен строк в Python - PullRequest
28 голосов
/ 19 апреля 2009

Есть ли более короткий способ написать следующий код?

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

Ответы [ 7 ]

54 голосов
/ 19 апреля 2009

Похоже, хорошая возможность использовать цикл:

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)
41 голосов
/ 19 апреля 2009

Вы можете легко использовать string.maketrans () для создания строки сопоставления для передачи в str.translate ():

import string
trans = string.maketrans("ABCDE","12345")
my_string = my_string.translate(trans)
15 голосов
/ 19 апреля 2009

Также посмотрите на str.translate(). Он заменяет символы в соответствии с отображением, которое вы предоставляете для строк Unicode, или иначе должен быть указан, что заменить каждый символ с chr (0) на chr (255) на.

11 голосов
/ 19 апреля 2009

Если вы хотите получить неправильный ответ, медленно, затем используйте 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.

8 голосов
/ 19 апреля 2009
replaceDict = {'A':'1','B':'2','C':'3','D':'4','E':'5'}       
for key, replacement in replaceDict.items():  
  my_string = my_string.replace( key, replacement )
0 голосов
/ 27 марта 2019

Я думаю, что это может быть немного более эффективным:

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".

0 голосов
/ 26 мая 2017

Один из способов сделать это - связать массив (словарь). Вот пример замен, которые я использую при подготовке файла к развертыванию в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...