替换密文中的字母

2024-05-15 03:33:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把正文中的每一个字母改为下一个字母后的。但是这个程序不起作用。有人知道为什么吗。提前谢谢。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)

Tags: textimport程序string字母asciigrwms
3条回答

在python中,字符串是不可变的。

因此text.replace返回字符串,但不更改其原始字符串。

鉴于此,您不应该实际使用text.replace,因为您将不得不更改字符串24次(或者可能26次,见下文)。实际上,您可以创建一个转换表来同时执行所有更改,并使用string.translate

要做到这一点,您应该首先使用string.maketrans将字母从后面的字母转换为后面的第二个字母(您想对“y”和“z”做什么?我想他们可能会变成“a”和“b”)。它将为translate的所有可能字符提供一个翻译表。

第一个错误是字符串是不可变的,因此replace不会执行任何操作。要替换字符串中的字符,必须重新分配:

text = text.replace(a, b)

但无论如何,这是一种非常低效的方法,因为您正在创建许多临时字符串,这些字符串稍后将被再次丢弃。您应该尝试遍历一次处理一个字符的字符串和结果join

我不会把全部的解决办法都给你,这样你就可以再有一次机会了。

这应该符合您的要求:

>>> 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  '

相关问题 更多 >

    热门问题