问题描述
我在此程序中要将普通消息转换为加密的消息。
在程序中,它用相反的字母替换每个字母。
当它从c = c.replace('n','m')
更改时,它将替换之前替换的所有内容。
def convert(c):
c = c.replace('a', 'z')
c = c.replace('b', 'y')
c = c.replace('c', 'x')
c = c.replace('d', 'w')
c = c.replace('e', 'v')
c = c.replace('f', 'u')
c = c.replace('g', 't')
c = c.replace('h', 's')
c = c.replace('i', 'r')
c = c.replace('j', 'q')
c = c.replace('k', 'p')
c = c.replace('l', 'o')
c = c.replace('m', 'n')
c = c.replace('n', 'm')
c = c.replace('o', 'l')
c = c.replace('p', 'k')
c = c.replace('q', 'j')
c = c.replace('r', 'i')
c = c.replace('s', 'h')
c = c.replace('t', 'g')
c = c.replace('u', 'f')
c = c.replace('v', 'e')
c = c.replace('w', 'd')
c = c.replace('x', 'c')
c = c.replace('y', 'b')
c = c.replace('z', 'a')
return c
print(convert('the quick brown fox jumps over the lazy dog'))
输出为:
ghe jfick bildm flc jfmkh leei ghe laab dlg
它不会转换所有字母。 有人可以帮忙吗?
1楼
您应该使用str.translate()
因为它接受映射并立即应用所有字符:
def convert(c):
return c.translate(mapping)
您可以像这样进行映射:
mapping = {
ord('a'): 'z',
ord('b'): 'y',
...
}
但是幸运的是,python还具有maketrans()
函数来帮助您进行此映射:
mapping = str.maketrans(string.ascii_lowercase, string.ascii_lowercase[::-1])
2楼
让我们逐步了解这段代码中发生的事情。 假设c是字符串“ yabz”。
c = "yabz"
将所有“ a”实例替换为“ z”。
c = "yzbz"
将所有“ b”实例替换为“ y”。
c = "yzyz"
现在,当您开始替换“ y”和“ z”时,某些字母会变回它们的开头:
c = c.replace("y","b") #c is now "bzbz"
c = c.replace("z","a") #c is now "baba"
如此一来,您可以将字母表前半部分的字母正确转换为后半部分的字母,但是您不小心将它们改了回来。 您可以从输出中看到,因此,字母表的后半部分没有字母出现。 由于这看起来像一个练习,因此您应该尝试自己解决问题,但是这里有一个可能的解决方案:
s = "I am noob" import string letters = string.ascii_lowercase # construct a dictionary mapping from a letter to its dual opposite starting from the end # of the alphabet table rep_dict = dict(zip(letters, letters[::-1])) # use the dictionary to replace the letters ''.join(map(rep_dict.get, s.replace(" ", "").lower())) # 'rznmlly'
资料来源: :