替换秘密文本中的字母

时间:2009-12-28 22:33:25

标签: python string

我希望在下一封信之后将文本中的每个字母都更改为。但是这个程序不起作用。有谁知道为什么。提前致谢。 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 个答案:

答案 0 :(得分:8)

python中的字符串不可变

所以text.replace 返回字符串,但不会更改其原始字符串。

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

要做到这一点,你应该首先使用string.maketrans将字母转换为下面的第二个字母(以及你想用'y'和'z'做什么?我希望它们应该成为' a'和'b')。这将为您提供translate的所有可能字符的翻译表。

答案 1 :(得分: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  '

答案 2 :(得分:3)

你的第一个错误是字符串是不可变的,所以你的替换没有做任何事情。要替换字符串中的字符,您必须重新分配:

text = text.replace(a, b)

但是,这是一种非常低效的方法,因为你创建了许多临时字符串,不久之后就会再次丢弃它们。您应该尝试迭代处理一个字符的字符串和join结果。

我不会放弃完整的解决方案,以便你可以再去一次。

答案 3 :(得分:2)

好的,我收录了这些建议,但现在还不是很好......

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. "
convert = lambda t: chr(ord('a') + (ord(t) - ord('a')) % 26)
txt_mod = ''.join(convert(chr(ord(t) + 2) if 'a' <= t <= 'z' else t) for t in text)

答案 4 :(得分:2)

最接近你的解决方案是:

letters = string.ascii_lowercase
uletters = string.ascii_uppercase
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(0,26):
    text=text.replace(letters[x-2],uletters[x])
print(text.lower())

答案 5 :(得分:2)

import string    

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. "    
trans = string.maketrans('abcdefghijklmnopqrstuvwxyz', 'cdefghijklmnopqrstuvwxyzab')
string.translate(s, trans)

答案 6 :(得分:1)

我以一种常见的方式完成了它。这是我的代码。我didn't use string.translate我尝试了@ mangobug的代码。我不知道为什么,但它不起作用。

import string
def puzzle(x):
    y=" "
    for i in x:
        if ord("a")<= ord(i)<=ord("x"):
            n=ord(i)+2
        elif ord(i)==ord("y"):
            n=ord("a")
        elif ord(i)==ord("z"):
            n=ord("b")
        else:
            n=ord(i)
        y=y+chr(n)
    return y

x="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."
y=puzzle(x)
print y

答案 7 :(得分:0)

你不忘记忘记基本情况吗?

我看到的问题是: 1)

for x in range(1,24):

- 不应该是你的字符串长度吗?

2)

text.replace(letters[x],letters[x+2])

当x == 23时会发生什么?我建议使用((x + 2)%len(字母))或类似的东西。

另外,您确定文本正在更新吗?我知道python将字符串视为数组,但这是否意味着每次替换时字母都会更新?

尝试:

text = text.replace(letters[x],letters[x+2])