2017-01-01 105 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'内部实现?它是否像我们使用的映射字典一样使用类似的方法?还是一些更有效的想法? –