我正在尝试重新排列使用凯撒密码编码的谜题中的长句子。
这是我的代码。
sentence="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."
import string
a=string.ascii_lowercase[]
b=a[2:]+a[:2]
for i in range(26):
sentence.replace(sentence[sentence.find(a[i])],b[i])
是我,替换功能中缺少任何内容吗?
当我尝试sentence.replace(sentence[sentence.find(a[0])],b[0])
它奏效了,但是为什么我无法遍历? 谢谢。
答案 0 :(得分:2)
sentence.replace
返回一个新字符串,您将立即将其丢弃。请注意,重复替换每个字符将导致密码中的重复替换。请参阅@RemcoGerlich的答案以获取有关错误原因的详细说明。至于解决方案
import string
letters = string.ascii_lowercase
shifted = {l: letters[(i + 2) % len(letters)] for i, l in enumerate(letters)}
sentence = ''.join(shifted.get(c, c) for c in sentence.lower())
或者如果您真的想要表格方式:
from string import ascii_lowercase
rotated_lowercase = ascii_lowercase[2:] + ascii_lowercase[:2]
translation_table = str.maketrans(ascii_lowercase, rotated_lowercase)
sentence = sentence.translate(translation_table)
答案 1 :(得分:2)
有一些问题:
一个,sentence[sentence.find(a[i])]
很奇怪。它尝试查找句子中字符a[1]
出现在哪里,然后查找其中存在哪个字符。好吧,您已经知道-a[1]
。除非字符串中不存在该字符,否则.find将返回-1,并且句子[-1]是句子中的最后一个字符。可能不是您的意思。因此,您的意思是sentence.replace(a[i], b[i])
。
但是,您不会在任何地方保存结果。您的意思是sentence = sentence.replace(a[i], b[i])
。
但是那仍然行不通!如果应该将a
更改为b
,然后将b
更改为c
怎么办?然后,原始的a
也被更改为c
!这是您的方法的根本问题。
modesitt提供了更好的解决方案。我本来会是这样的
lookupdict = {a_char: b_char for (a_char, b_char) in zip(a, b)}
sentence_translated = [lookupdict.get(s, '') for s in sentence]
sentence = ''.join(sentence_translated)