2016-11-19 2 views
2

파이어 톤을 사용하여 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()) 

그러나 가장 자주 나오는 문자부터 내림차순으로 대답을 인쇄 할 수있는 방법이 있습니까? 대답은 내가하는 일에 관계없이 무작위 순서로 표시됩니다.

또한 특정 문자를 추출하여 주파수 분석을 수행하기 위해 큰 텍스트 블록을 작성하는 방법을 알고있는 사람이 있습니까? 내가 분석 할 함께 텍스트 "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  

I 소요 메모장 또는 Excel 중 하나로 손으로이 작업을 수행 할 것 나이. 파이썬에서이 문제를 해결할 수있는 방법이 있습니까? 사전에

감사합니다, 당신은 Counter 사용할 수 내림차순의 경우
토니

답변

2

3.

에 공백이 당신을 제외하려면 당

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

이 두 번째 질문에 관해서는 당신이 반복 수 @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

@ 토니 장, 답변을 업데이트하십시오! – coder

1

@code의 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())) 

하는 list 빈도를 기준으로 내림차순으로 정렬 tuple의의 :

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