rot13不旋转'b'

时间:2014-02-24 06:35:19

标签: python rot13

这是python中的rot13函数:

from string import ascii_lowercase

def rot13(string):
    l = list(ascii_lowercase)
    nl = [l[:13],l[13:]]
    tr_dict1 = dict(zip(nl[0], nl[1]))
    tr_dict2 = dict(zip(nl[1], nl[0]))
    #print tr_dict1
    #print tr_dict2
    for char in string:
        if char in tr_dict1:
            string = string.replace(char, tr_dict1[char])
        if char in tr_dict2:
            string = string.replace(char, tr_dict2[char])
    print string

string = raw_input('Enter string: ')
rot13(string)

为什么将bo翻译为bb而不是ob?如果您单独输入b,则会转换为o

2 个答案:

答案 0 :(得分:4)

因为str.replace()取代了该字符的 所有 实例,即使是已经替换过的实例也是如此。从替换中生成新字符串,而不是修改现有字符串。

答案 1 :(得分:2)

您可以更轻松地更换这样的字符:

from string import ascii_lowercase

l = list(ascii_lowercase)
tr = dict(zip(l, l[13:] + l[:13]))

def rot13(inval):
    return "".join(tr.get(char, char) for char in inval)

string = raw_input('Enter string: ')
print rot13(string)

由于它不使用替换,因此它不会遇到@Ignacio正确指出的相同问题。