下面的代码将明文消息的每个字母移位2个字母表中的位置。问题是这个代码没有循环回到字母y和z或Y和Z之后的字母表开头。我一直试图解决这个问题。我该怎么做才能解决这个问题?
msg = raw_input("any string goes here")
cypher = ""
for a in msg:
cypher = cypher + chr(ord(a) + 2)
print cypher
答案 0 :(得分:3)
您可以使用string
模块制作自己的ascii字母列表。然后,您不必担心ord
方法涉及的所有其他unicode字符。小写ascii字母的示例是:
import string
msg = raw_input("any string goes here")
cypher = ""
#creates a alphabet of lowercase ascii characters
alphabet = string.ascii_lowercase
for a in msg:
cypher = cypher + alphabet[((alphabet.index(a) + 2) % 26)]
print cypher
或者,如果你真的开始使用ord
方法,你可以使用它:
cypher = cypher + chr(((ord(a) - 95) % 26) + 97)
为了更好地解释这一点,在unicode中,字母表从索引97(97 =“a”)开始,结束索引122(122 =“z”)。因此,通过减去95,我实际上将字母索引增加了两个。然后处理包装到我们使用的开始问题
% 26
以便索引始终在0到25之间。然后我最后添加了97,以便索引返回到unicode字母的97到122范围内。
答案 1 :(得分:0)
cypher = cypher + chr((ord(a) + 2) % 26)
答案 2 :(得分:0)
我建议调查模运算符。
可能是这样的: cypher + chr((ord(a)+ 2)%26