在Python中对文本字符串使用凯撒密码?
我正在慢慢搞懂Python的各种细节。简单来说,我想找一种方法,可以在Python中把一串字符向右移动'x'个字符。
举个例子,如果我输入abcdefg,设置x为2,那么我想得到的结果就是cdefghi。
5 个回答
5
我觉得你可以看看 string.translate 这个内容。你可能需要用到 make_trans 来创建你想要的映射关系。
9
我的第一个版本:
>>> key = 2
>>> msg = "abcdefg"
>>> ''.join( map(lambda c: chr(ord('a') + (ord(c) - ord('a') + key)%26), msg) )
'cdefghi'
>>> msg = "uvwxyz"
>>> ''.join( map(lambda c: chr(ord('a') + (ord(c) - ord('a') + key)%26), msg) )
'wxyzab'
(当然,只有当msg是小写字母时,它才会按预期工作...)
补充说明:我完全同意David Raznick的回答:
>>> import string
>>> alphabet = "abcdefghijklmnopqrstuvwxyz"
>>> key = 2
>>> tr = string.maketrans(alphabet, alphabet[key:] + alphabet[:key])
>>> "abcdefg".translate(tr)
'cdefghi'
3
我会这样做(为了简单易懂):
def encode(s):
l = [ord(i) for i in s]
return ''.join([chr(i + 2) for i in l])
这里的意思是,你把字母转换成ASCII码,然后在这个代码上加2,再把它转换回来,最后“转型”成一个字符串(也就是创建一个新的字符串对象)。这样做也不考虑字母的大小写(大写和小写)。
可能的优化和研究方向:
- 对于大字符串,可以使用StringIO模块
- 将这个方法应用到Unicode(具体怎么做还不太确定)