我正在尝试创建一个简单的Caesar Code函数,该函数必须解密输入中给定的字符串。
[明文= A B C D E F G H I J K L M N O P Q R S T U V W X Y Z]
已加密= D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
这是我给DECIPHER的代码:
def deciph(s):
b='abcdefghijklmnopqrstuvwxyz'
a='defghijklmnopqrstuvwxyzabc'
for i in s:
for j in range(len(a)):
if i==a[j]:
s=s.replace(i,b[j])
return s
此代码几乎总是可以正常工作,例如:
deciph('vxq') --> 'sun'
deciph('ohwwhu') --> 'letter'
问题是这种情况的问题:
deciph('sp')--> 'mm' #should be 'pm'
deciph('ol')-->'ii' #should be 'li'
因此,解密后的第一个字母等于加密的第二个字母。
如何修改我的代码?错误在哪里?我知道互联网上还有许多其他方法可以执行相同的练习,但是现在我有兴趣了解MY代码的错误。
让我们以您的deciph('sp')
为例。问题是,当您执行s=s.replace(i,b[j])
时,首先将's'
的所有实例替换为'p'
,得到s = 'pp'
,然后在第二遍,将'p'
的所有实例替换为'm'
,给你s = 'mm'
。这可以通过以下方法纠正:保留一个新的初始变量rv = ''
,然后为每个字母使用rv+=b[j]
而不是更改s
。然后最后,只需返回rv
。