使用python进行频率分析

使用python进行频率分析,python,excel,cryptography,frequency-analysis,vigenere,Python,Excel,Cryptography,Frequency Analysis,Vigenere,我正在尝试使用python来帮助我破解Vigenère密码。我对编程相当陌生,但我已经成功地做了一个算法来分析单字母频率。这就是我到目前为止所做的: Ciphertext = str(input("What is the cipher text?")) Letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" def LetterFrequency(): LetterFrequency = {'A': 0, 'B': 0, 'C': 0, 'D': 0, 'E':

我正在尝试使用python来帮助我破解Vigenère密码。我对编程相当陌生,但我已经成功地做了一个算法来分析单字母频率。这就是我到目前为止所做的:

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())
但是有没有一种方法可以让我从最常见的字母开始按降序打印答案呢?无论我做什么,答案现在都以随机顺序显示

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

T   H   I  
S   I   S  
A   R   A  
T   H   E  
R   B   O  
R   I   N  
G   E   X  
A   M   P  
L   E     
通常情况下,我必须在记事本或excel中手工完成这项工作,这需要很长时间。有没有办法用python解决这个问题

提前感谢,

Tony

对于降序,您可以使用:

至于第二个问题,你可以每3个重复一次

要排除空格,您可以尝试@not_a_robot在评论或 手动删除它,如:

>>> 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})

另一种方法,尽管@coder中的
collections.Counter
示例是您的最佳选择

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()))
它会打印出一个
列表
,该列表由
元组
组成,按频率向下排序:

[('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)]

谢谢这似乎有效,但我可以不在计数器中包含空格吗?请尝试
计数器(如果字母!='',则以x表示字母)
[('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)]