2017-01-01 104 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'沒有這個問題,因爲它可以以C速度運行,以Python中無法實現的方式操作char數據,並且它僅轉換源字符串中存在的字符,而不是循環遍歷每個字符在'from_field'&'to_field'中配對。 –

+0

感謝ebeneditos,爲您的答案投票。你如何看待'replace'在內部工作?它是否像我在原始文章中那樣使用映射字典或者一些更有效的想法? –

+0

@ PM2Ring,很好的捕獲,你覺得'.translate'內部實現?它是否像我們使用的映射字典一樣使用類似的方法?還是一些更有效的想法? –