我正在尝试修改一段文本以应用以下翻译:
before: abcdefghijqlmnopqrstuvwxyz
after: zyxwvutsrqponmlkjihgfedcba
即每个a都变成了一个z;每个 b 变成一个 y;每个 c 变成一个 x;等等。
我的脚本:
myInput = input("Entrer une chaine de caracteres:\n\n")
myInputSansEspace = myInput.replace(" ", "")
myInputAsciiInverse = myInputSansEspace.replace("a","z").replace("b","y").replace("c","x").replace("d","w").replace("e","v").replace("f","u").replace("g","t").replace("h","s").replace("i","r").replace("j","q").replace("k","p").replace("l","o").replace("m","n").replace("n","m").replace("o","l").replace("p","k").replace("q","j").replace("r","i").replace("s","h").replace("t","g").replace("u","f").replace("v","e").replace("w","d").replace("x","c").replace("y","b").replace("z","a")
print(myInputAsciiInverse)
不幸的是,它不起作用。例如,如果我写:
i am noob
返回应该是:
rznmlly
因为 i 被替换为 r; a by z; m by n;等等
我得到的结果是:
boonmai
请您参考如下方法:
你的方法有副作用,所以不会做你想做的事。
进行第一次替换:
'a...z'.replace('a', 'z') == 'z...z'
现在考虑最后一个替换:
'z...z'.replace('z', 'a') == 'a...a'
因此最终只有一半的字母表。
您可以简单地用reverse 或切片替换所有的replace:
'abc..xyz'.reverse() == 'zyx..cba'
'abc..xyz'[::-1] == 'zyx..cba'
如果您尝试将翻译作为一种密码手段,那么您可以使用 str.maketrans 和 str.translate,例如:
>>> alphabet = 'abcdefghijklmnopqrstuvwxyz'
>>> trans = str.maketrans(alphabet, alphabet[::-1], ' ')
>>> noob = 'I am noob'
>>> noob.lower().translate(trans)
'rznmlly'
注意:alphabet等同于string.ascii_lowercase
以上基本上等同于:
>>> import string
>>> trans_table = dict(zip(string.ascii_lowercase, string.ascii_lowercase[::-1]))
>>> ''.join(trans_table.get(c, c) for c in noob.lower() if c not in ' ')
'rznmlly'
