次のコードを書くためのはるかに短い方法はありますか?
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行未満に変換する方法を探しています
ループを使用する良い機会のように見えます:
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)
String.maketrans()を使用して、str.translate()に渡すマッピング文字列を簡単に作成できます。
import string
trans = string.maketrans("ABCDE","12345")
my_string = my_string.translate(trans)
str.translate()
も確認してください。これは、Unicode文字列に指定したマッピングに従って文字を置き換えます。そうでない場合は、chr(0)からchr(255)までの各文字を何に置き換えるかを通知する必要があります。
間違った答えをゆっくりと取得したい場合は、ループで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を使用します。
replaceDict = {'A': '1'、 'B': '2'、 'C': '3'、 'D': '4'、 'E': '5'} キー、replaceDict.items()の置換: my_string = my_string.replace(key、replacement)
私はそれがもう少し効率的かもしれないと思います:
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」の長さに基づいています。