2014-10-10 75 views
0

我试图创建一个凯撒暗号解码器,它发生在一个编码信息,查找最常用的字母,假定这封信是“E”(因为它是最常用的字母),然后将字母移到正确的位置,直到整个信息被解码。Python的凯撒暗号使用最常见的字母来解码消息

编码器只能处理足够大的字符串,以便读取所有使用的字母,并且希望字符串是一个平均句子,其中“e”用得最多,但我不确定如何做到这一点?

我是新来的Python和我想到的第一件事情是使计数器的列表每个字母,然后检查情况下每个字母都有字符串中的数字,加1无论哪种情况都与信件配合。我不知道如何投入这个代码虽然...

+0

不要试图把代码变成注释。只需编辑您的问题以将代码添加到其中。 – abarnert 2014-10-10 00:23:57

+0

同时,你有没有学过字典呢?或者使用标准库模块,比如'collections'?如果是这样,那会让生活变得更容易。 – abarnert 2014-10-10 00:24:37

+1

可爱的想法。这篇关于[英文字母频率]的文章(http://en.wikipedia.org/wiki/Letter_frequency#Relative_frequencies_of_letters_in_the_English_language)可能会有帮助。 OTOH,['etaoinshrdlu'](http://en.wikipedia.org/wiki/Etaoin_shrdlu)可能足以满足您的需求。 FWIW,在我年轻的时候,我曾经非常擅长手工打碎凯撒密码,但是我从来没有写过一个程序去做。但我很希望看到你的代码... – 2014-10-10 02:19:14

回答

0

Counter可以做最困难的工作对您:

>>> letters = 'imtryingtocreateacaesarcypherdecoder' 
>>> c = collections.Counter(letters) 

这给你一个映射,其中字母'e'映射到6,'r'至5,'c''a'至4,等。为了找到最常见的字母,您只要调用方法most_common

>>> c.most_common(1) 
[('e', 6)] 
>>> c.most_common(1)[0][0] 
'e' 

所以,你还剩下唯一的问题是如何把你的编码信息,扔掉所有的非字母,并把所有的字母变成小写。如果你看看str类型的方法,你应该能够很容易地弄清楚这一点。

(你也可能需要使用filter,或理解;你可能会发现,比类似str.translate容易你实际上并不需要一个字符串传递给Counter,只是字母可迭代;列表或生成器表达式是罚款)。

+0

谢谢!多亏了你,我才能使大部分代码正常工作。我现在唯一的问题是,只要字母“y”或“z”在句子中,它们就会变成其他不属于字母表的字符,但我会在另一个问题中提出这个问题。谢谢大家的信息! – 2014-10-10 02:50:29

+1

@SpookChaser不要忘了接受的答案,如果你认为他们回答你的问题,它是在回答左侧的V标记... – 2014-10-10 22:36:47

+0

@SpookChaser:你是什么意思'“Y”或“Z” [.. 。]更改为不属于字母表的其他字符?他们不应该这样做!我怀疑你的日常工作中有一个错误。发布你的代码,我们会帮助你解决它,无论是在这里还是在一个新的问题。 – 2014-10-11 02:28:07