web-dev-qa-db-ja.com

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行未満に変換する方法を探しています

29
Teifion

ループを使用する良い機会のように見えます:

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)
57
Rick Copeland

String.maketrans()を使用して、str.translate()に渡すマッピング文字列を簡単に作成できます。

import string
trans = string.maketrans("ABCDE","12345")
my_string = my_string.translate(trans)
41

str.translate() も確認してください。これは、Unicode文字列に指定したマッピングに従って文字を置き換えます。そうでない場合は、chr(0)からchr(255)までの各文字を何に置き換えるかを通知する必要があります。

15
Artelius

間違った答えをゆっくりと取得したい場合は、ループで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を使用します。

11
Darius Bacon
replaceDict = {'A': '1'、 'B': '2'、 'C​​': '3'、 'D': '4'、 'E': '5'} 
キー、replaceDict.items()の置換:
 my_string = my_string.replace(key、replacement)
8
Stefan Kendall

私はそれがもう少し効率的かもしれないと思います:

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
Zompa