替换密文中的字母
我想把文本中的每个字母都替换成它后面下一个字母。但是这个程序不管用。有没有人知道为什么?提前谢谢你们。另外,y和z也有个小问题。
import string
letters = string.ascii_lowercase
text=("g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj. ")
for x in range(1,24):
text.replace(letters[x],letters[x+2])
print(text)
8 个回答
3
你的第一个错误是字符串是不可变的,所以你用的replace方法其实没有任何效果。要替换字符串中的字符,你需要重新赋值:
text = text.replace(a, b)
不过,这种做法其实效率很低,因为你会创建很多临时字符串,而这些字符串很快就会被丢弃。你应该尝试逐个处理字符串中的字符,然后用join方法把结果连接起来。
我不会给出完整的解决方案,这样你可以再试一次。
4
这段代码应该能满足你的需求:
>>> rot = lambda xs: (xs + [xs[0]])[1:]
>>> apply = lambda n,f,x: (n == 0) and x or f(apply(n-1,f,x))
>>> abc = map(chr,range(ord('a'),ord('z')+1))
>>> d = dict(zip(list(abc),apply(2,rot,(list(abc)))))
>>> s = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj. "
>>> reduce(lambda a,b:a+b,map(lambda c: d.get(c,' '),list(s)),"")
'i hope you didnt translate it by hand thats what computers are for doing it in by hand is inefficient and that s why this text is so long using string maketrans is recommended now apply on the url '
8
在Python中,字符串是不可变的。
这意味着当你使用text.replace
时,它会返回一个新的字符串,但不会改变原来的字符串。
所以,其实你不应该频繁使用text.replace
,因为你可能需要对字符串进行24次(或者可能是26次,具体见下文)替换。相反,你可以创建一个翻译表,一次性完成所有的替换,然后使用string.translate
。
要做到这一点,首先你需要使用string.maketrans
来把字母转换为它后面的第二个字母(还有'y'和'z'你想怎么处理呢?我想它们可能应该变成'a'和'b')。这样你就能得到一个包含所有可能字符的翻译表,供translate
使用。