在Python中对文本字符串使用凯撒密码?

2 投票
5 回答
5534 浏览
提问于 2025-04-15 13:10

我正在慢慢搞懂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(具体怎么做还不太确定)

撰写回答