使用字典解码句子

时间:2019-04-24 05:14:10

标签: python

首先,我是python的新手,通常对编程没有经验。

我的问题是我无法一口气转换整个句子。我尝试了for循环,但是最后以a和b的整个句子结束。有没有一种有效的方法来转换每个字母而无需创建一个新的显示句子的列表?

我尝试了for循环并使用:来显示列表中的所有值,但是for循环不断转换已转换的字母,而:给了我错误提示我不能将整个列表用作字典的键。

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."
#sentence before conversion
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
new_letters = {}
#dictionary that makes all conversions (basically go 2 letters down the alphabet, a=c, b=d)
for i in range(0, 24):
    new_letters.update({(letters[i]): (letters[i+2])})
    i+=1
    #creates dictionary
new_letters.update({'y':'a', 'z':'b'})
#had to add in y and z because I cannot go 2 letters down from y or z
new_sentence = sentence.replace(letters[], new_letters[letters[]])
#trying to replace certain letters with other letters, using the new_letters dictionary
print(new_letters)
print(new_sentence)

是的,这是来自http://www.pythonchallenge.com/index.php的:D

2 个答案:

答案 0 :(得分:3)

因此,基本上,您想将字符串中的每个字符替换为向后旋转两位的字母等效字符(因此'a'变成'c''b'变成{{1} }等)。

有几种方法可以做到这一点。正如您所注意到的,您不能使用朴素的for循环,因为您将转换已经转换一次的字符。幸运的是,Python字符串具有'd'方法,该方法采用translate来将字符相互映射。因此,您可以执行以下操作:

dict

输出:

from string import ascii_lowercase, ascii_uppercase

rotated_lowercase = ascii_lowercase[2:] + ascii_lowercase[:2]
rotated_uppercase = ascii_uppercase[2:] + ascii_uppercase[:2]

translation_table = str.maketrans(ascii_lowercase + ascii_uppercase, rotated_lowercase + rotated_uppercase)

print('This is a translated string.'.translate(translation_table))

Vjku ku c vtcpuncvgf uvtkpi. ascii_lowercase模块中的一个属性,它包含整个小写字母,因此您不必手动键入它。

string将字母的第三个字符添加到末尾,并将前两个字符添加到末尾,这样您就得到了rotated_alphabet

然后我们可以将两者与'cde...zab'放在一起,使得maketrans映射到ac映射到b,依此类推,就像我们想要。

最后,只要在我们要转换的任何字符串上调用d方法,并将其传入转换表即可(注意,句号未触及)。

答案 1 :(得分:2)

一些注意事项-我将尽量靠近您给定的实现,并按要求使用字典。您无需显式列出所有字母的列表,python会为您提供。

translate

其次,字母长度为26个字符,因此第25和26个字符+ 2不再有效,您需要使用modulo绕到字母的开头。这是使用dictionary comprehension

import string
letters = string.ascii_lowercase

如果你想露骨

shifted = {l: letters[(i + 2) % len(letters)] for i, l in enumerate(letters)}

然后,您要遍历旧字母,用新的映射替换每个旧字母。

shifted = {}
for i, l in enumerate(letters):
     shifted[l] = letters[(i + 2) % len(letters)]

这可以通过用所需的移位替换每个字符来实现,只要它不是空格,句点或其他非移位字符即可。如果在字典中未找到任何内容,sentence = ''.join(shifted.get(c, c) for c in sentence.lower()) 将使用可选的第二个参数作为默认值。请参阅gmds的答案以获取更多的pythonic实现。另外,这称为Caesar cipher