rot13没有正确翻译python

时间:2016-02-11 10:04:04

标签: python

我正在尝试将字符串翻译成rot13,所以我编写了以下代码:

def str_rot_13(my_string):
    list_string = list(my_string)
    number_string = [ord(x) for x in list_string]
    new_number_string = [x + 13 for x in number_string]   
    new_list_string = [chr(x) for x in new_number_string]
    my_new_string = ''.join(new_list_string)
    return my_new_string

我的问题是,如果我在字母表中向下走,它会开始返回奇怪的数字和斜线。我尝试在ord('a')中创建一个范围到ord('z'),但它仍然返回数字和斜杠。任何帮助,将不胜感激!

2 个答案:

答案 0 :(得分:2)

通过执行(((x + 13-97)%26)+97) X值始终介于97和122之间(ord("a") = 97, ord("z") = 122),那么您输出的内容将始终是一个完全由字母组成的字符串。

def str_rot_13(my_string):
    list_string = list(my_string)
    number_string = [ord(x) for x in list_string]
    new_number_string = [(((x + 13-97)%26)+97) for x in number_string]   
    new_list_string = [chr(x) for x in new_number_string]
    my_new_string = ''.join(new_list_string)
    return my_new_string
  

输出:

>>> print str_rot_13("my string")
zlafgevat
>>> 

答案 1 :(得分:1)

rot13的想法是(英文)字母表中有26个字母。因此,应用rot13会为您提供原始字符串。 ord但是会​​为您提供Ascii符号(其中有128个)。

如何使用string.ascii_lowercase

import string    

def str_rot_13(my_string):
    alphabet = list(string.ascii_lowercase)
    list_string = list(my_string)
    number_string = [alphabet.index(x) for x in list_string]
    new_number_string = [x + 13 for x in number_string]   
    new_list_string = [alphabet[x%26] for x in new_number_string]
    my_new_string = ''.join(new_list_string)
    return my_new_string

或更短

def rot13(s):
    alphabet = list(string.ascii_lowercase)
    chars = map(lambda x: alphabet[(alphabet.index(x) + 13) %26], s)
    return ''.join(chars)