2017-01-01 18 views
1

Python 2.7を使用し、以下の文字列を使用して問題を置き換え、アルゴリズム空間の複雑さとアルゴリズムの複雑さの点でより良いアイデアがあるのだろうか?Python 2.7の文字列置換

文字列Python 2.7が不変であるため、結果を表す追加のリストを作成します。また、文字置換テーブルの検索を高速化するための追加辞書も作成しました。

この例では、From:"lod"とTo:"xpf"は、lで満たされた場合、xに置き換えます。 oを満たした場合は、pに置き換えてください。 dを満たした場合は、fに置き換えてください。

''' 
Given "data", "from", and "to" fields, replaces all occurrences of the characters in the "from" field in the "data" field, with their counterparts in the "to" field. 
Example: 
Input: 
Data: "Hello World" 
From: "lod" 
To: "xpf" 
Output: 
"Hexxp Wprxf" 
''' 

from collections import defaultdict 
def map_strings(from_field, to_field, data): 
    char_map = defaultdict(str) 
    result = [] 
    for i,v in enumerate(from_field): 
     char_map[v]=to_field[i] 
    for v in data: 
     if v not in char_map: 
      result.append(v) 
     else: 
      result.append(char_map[v]) 

    return ''.join(result) 

if __name__ == "__main__": 
    print map_strings('lod', 'xpf', 'Hexxp Wprxf') 
+3

[str.maketrans](https://docs.python.org/3/library/stdtypes.html#str.maketrans) – wwii

+2

質問を注意してください@wwii 'python-2.7'タグが付いています。 'str.maketrans'メソッドはPython 3にしか存在しませんが、私の答えではPython 2には少し違う' string.maketrans'関数があります。 –

+1

@ PM2Ring、aye '' 'string.maketrans'''です。 – wwii

答えて

4

このために標準モジュールには効率的な機械があります。あなたが最初のstring.maketransを使用して変換テーブルを構築し、その後、str.translateメソッドを呼び出します。

import string 

trans = string.maketrans('lod', 'xpf') 
print "Hello World".translate(trans) 

出力を

Hexxp Wprxf 

しかし、あなたはそれを手動で行いたい場合は、ここで少しだ方法です現在のコードよりも効率的です:

def map_strings(from_field, to_field, data): 
    char_map = dict(zip(from_field, to_field)) 
    return ''.join([char_map.get(c, c) for c in data]) 

s = map_strings('lod', 'xpf', 'Hello World') 
print s  

Python 3ではstring.maketrans関数が存在しないことに注意してください。わずかに異なる動作をするstr.maketransメソッドがあります。

+0

PM 2Ringに感謝、あなたの答えを投票してください。しかし、あなたの方法は私のものよりも効率的だと思うのはなぜですか?私たちは同じアイデアを使っていると思いますか? :) –

1

またreplaceを使用することができます。

def map_strings(from_field, to_field, data): 
    for f, t in zip(from_field, to_field): 
     data = data.replace(f, t) 
    return data 
+1

確かに、それはうまくいき、 'from_field'と' to_field'が非常に短いときに '.translate'を使うよりも効率的かもしれません。しかし、一般的には、複数のメソッド呼び出しを行い、各ループ反復で新しい文字列を割り当てる必要があるため、効率が低下します。 '.translate'はPythonでは不可能な方法でcharデータを操作するCの速度で動くことができ、すべての文字をループするのではなく、元の文字列にある文字だけを変換するので、 'from_field'と' to_field'のペアです。 –

+0

お返事ありがとうございます。 'replace'は内部的にどのように動作すると思いますか?私はオリジナルの投稿やもっと効率的なアイデアのようにマッピング辞書を使用していますか? –

+0

@ PM2Ring、素敵なキャッチ、内部で '.translate'が実装されているとどう思いますか?私たちは使用しているマッピング辞書のような類似のアプローチを使用していますか?あるいはもっと効率的なアイデアですか? –