2016-11-19 96 views
2

我正在嘗試使用python來幫助我破解Vigenère密碼。我對編程相當陌生,但我設法制作了一種分析單字母頻率的算法。這是我到目前爲止:使用python進行頻率分析

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」一起來分析,我需要得到:

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中解決這個問題?

由於提前,
託尼

回答

2

對於您可以使用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在評論中建議的內容或者 將其手動刪除:

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

謝謝!這似乎工作,但我可以不包括在櫃檯的空間? –

+0

嘗試'計數器(字母在x中的字母!='') – blacksite

+0

@TonyZhang,更新了答案! – coder

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

它打印這一點,tuple S按頻率遞減排序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)]