字符串的编码器 - Python

时间:2016-04-04 02:17:07

标签: python string loops dictionary encoding

我一直在使用字典编写随机字符串集。我已经得到了我的代码来替换我想要的字母,但在某些情况下,它会多次替换一个字符,当我真的只想要它替换字符串中的字母一次。这就是我所拥有的:

def encode(msg,code):
    for i in msg:
        for i in code:
            msg = msg.replace(i, code[i])
        return msg

出于测试目的,我使用了函数调用: 初始:

encode("blagh", {"a":"e","h":"r"})

和更复杂的字符串:

encode("once upon a time",{'a':'ae','e':'ei','i':'io','o':'ou','u':'ua'})

对于上面的第二个,我正在寻找输出: ' ouncei uapoun ae tiomei'

但我发现自己:

" ounceio uapoun aeio tiomeio"

如何将循环限制为仅替换每个字符一次?

2 个答案:

答案 0 :(得分:1)

而不是使用str.replace,而是逐字符替换:

def encode(msg, code):
    result = ''
    for ch in msg:
        result += code.get(ch, ch)
    return result

使用generator expression

def encode(msg, code):
    return ''.join(code.get(ch, ch) for ch in msg)

答案 1 :(得分:1)

Python 3的str.translate函数可以满足您的需求。请注意,翻译词典必须使用Unicode序列作为键,因此该函数使用字典理解将其转换为正确的格式:

def encode(msg,code):
    code = {ord(k):v for k,v in code.items()}
    return msg.translate(code)

print(encode("blagh", {"a":"e","h":"r"}))
print(encode("once upon a time",{'a':'ae','e':'ei','i':'io','o':'ou','u':'ua'}))

输出:

blegr
ouncei uapoun ae tiomei

如果您使用Unicode字符串或在文件顶部添加以下内容以使字符串默认为Unicode,那么它也适用于Python 2:

from __future__ import unicode_literals