2009-04-18 12 views
22

次のコードを書くのにはるかに短い方法がありますか?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') 

これらの正確な値を置き換える必要はありません。あなたが気にしない場合

mapping = { 'A':'1', 'B':'2', 'C':'3', 'D':'4', 'E':'5'} 
for k, v in mapping.iteritems(): 
    my_string = my_string.replace(k, v) 

速いアプローチ:私は単に未満5

答えて

44

に5+ラインを有効にする方法を探していますと、ループを使用するためには良い機会のように見えますかっこは

mapping = [ ('A', '1'), ('B', '2'), ('C', '3'), ('D', '4'), ('E', '5') ] 
for k, v in mapping: 
    my_string = my_string.replace(k, v) 
+1

これは奇妙です。それは私がそれを書いている方法です、なぜならその問題はすべて、あるキャラクターから別のキャラクターへのマッピングであるからです。 実際、あなたはdictをdictとして使用していません。これをタプルのリストとして使用しています。だから、最初にタプルのリストを書くのはなぜですか? –

+0

確かにタプルのリストも機能します(より速くなります)。私は、そのオプションを含める答えを編集します。 –

+2

おそらく結果が期待通りではない – muni764

6
replaceDict = {'A':'1','B':'2','C':'3','D':'4','E':'5'}  
for key, replacement in replaceDict.items(): 
    my_string = my_string.replace(key, replacement)
15

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

35

あなたは簡単に)(str.translateに渡すマッピング文字列を作成するためにstring.maketrans()を使用することができます。

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

これはいいですが、複数文字のパターンや置換の場合は機能しません。 –

+0

正しい。私は、文字ベースの置換であるという質問から推測しました。 –

+0

は私に質問を保存します。 – ohho

10

をあなたが間違った答えを取得したい場合は、ゆっくりと、そして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を使用します。

+0

"string.replace"が間違った答えを返すと言って、re.sub、-1を使うというアプローチで+1します。ので、ネット0 :) –

+1

str.replaceは間違いなく間違った答えを与えることができます。辞書ベースのソリューションでは、文字列「wow」と変換テーブル{'w': 'foo'、 'o': 'bar'}を考慮してください。 dictが繰り返す順序によって、結果は「fbarbarbarfbarbar」または「foobarfoo」になる可能性があります。等しい入力に対して異なる出力を与える関数は、間違いなく壊れています。 – Miles

+0

マイル、はい、それは私が意味する問題の種類です。また、「hello」や「hell」のように、キーだけで重複することもあります。 –

1

私はそれを関連付けられた配列(辞書)と一緒にやっています。正規表現を使って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 
関連する問題