使用python进行频率分析

我正在尝试使用python来帮助我破解Vigenère密码。 我对编程相当陌生,但是我设法制作了一个分析单字母频率的algorithm。 这是我迄今为止:

Ciphertext = str(input("What is the cipher text?")) Letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" def LetterFrequency(): LetterFrequency = {'A': 0, 'B': 0, 'C': 0, 'D': 0, 'E': 0, 'F': 0, 'G': 0, 'H': 0, 'I': 0, 'J': 0, 'K': 0, 'L': 0, 'M': 0, 'N': 0, 'O': 0, 'P': 0, 'Q': 0, 'R': 0, 'S': 0, 'T': 0, 'U': 0, 'V': 0, 'W': 0, 'X': 0, 'Y': 0, 'Z': 0} for letter in Ciphertext.upper(): if letter in Letters: LetterFrequency[letter]+=1 return LetterFrequency print (LetterFrequency()) 

但是有没有办法让我从最频繁的信件开始按降序打印答案? 无论我做什么,答案都是随机显示的。

还有谁知道如何提取特定的字母形成一个大块的文本进行频率分析? 例如,如果我想把文本“THISISARATHERBORINGEXAMPLE”的每个第三个字母放在一起来分析,我需要得到:

 THISISARATHERBORINGEX AMPLE 

通常情况下,我将不得不在记事本或Excel中手工做这件事,这需要很长的时间。 有没有办法在python中解决这个问题?

提前致谢,
托尼

对于降序您可以使用Counter

 >>> x = "this is a rather boring example" >>> from collections import Counter >>> Counter(x) Counter({' ': 5, 'a': 3, 'e': 3, 'i': 3, 'r': 3, 'h': 2, 's': 2, 't': 2, 'b': 1, 'g': 1, 'm': 1, 'l': 1, 'o': 1, 'n': 1, 'p': 1, 'x': 1}) 

至于第二个问题,你可以迭代每3。

要排除空格,您可以尝试@not_a_robot在评论中build议的内容或手动删除它,如下所示:

 >>> y = Counter(x) >>> del y[' '] >>> y Counter({'a': 3, 'e': 3, 'i': 3, 'r': 3, 'h': 2, 's': 2, 't': 2, 'b': 1, 'g': 1, 'm': 1, 'l': 1, 'o': 1, 'n': 1, 'p': 1, 'x': 1}) 

另一种方法,虽然collections.Counter来自@coder的计数器例子是你最好的select。

 from collections import defaultdict from operator import itemgetter Letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Ciphertext = "this is a rather boring example" def LetterFrequency(): LetterFrequency = {letter: 0 for letter in Letters} for letter in Ciphertext.upper(): if letter in Letters: LetterFrequency[letter]+=1 return LetterFrequency def sort_dict(dct): return sorted(dct.items(), key = itemgetter(1), reverse = True) print(sort_dict(LetterFrequency())) 

哪一个打印这个,按频率递减sorting的tuple list

 [('A', 3), ('I', 3), ('E', 3), ('R', 3), ('T', 2), ('S', 2), ('H', 2), ('L', 1), ('G', 1), ('M', 1), ('P', 1), ('B', 1), ('N', 1), ('O', 1), ('X', 1), ('Y', 0), ('J', 0), ('D', 0), ('U', 0), ('F', 0), ('C', 0), ('Q', 0), ('W', 0), ('Z', 0), ('K', 0), ('V', 0)] 
Interesting Posts