Определение частоты букв текста шифра

Я пытаюсь сделать инструмент, который находит частоты букв в некотором типе зашифрованного текста. Предположим, что все строчные буквы a-z без цифр. Закодированное сообщение находится в текстовом файле

Я пытаюсь создать сценарий, который поможет взломать шифры замещения или, возможно, транспонирования.

Код до сих пор:

cipher = open('cipher.txt','U').read()
cipherfilter = cipher.lower()
cipherletters = list(cipherfilter)

alpha = list('abcdefghijklmnopqrstuvwxyz')
occurrences = {} 
for letter in alpha:
    occurrences[letter] = cipherfilter.count(letter)
for letter in occurrences:
    print letter, occurrences[letter]

Пока все, что он делает, это показывает, сколько раз появляется письмо. Как бы мне распечатать частоту всех букв, найденных в этом файле.

 S.Lott14 июн. 2009 г., 12:24
«Пока все, что он делает, это показывает, сколько раз появляется письмо. Как бы я распечатал частоту всех букв, найденных в этом файле». Какая? Частота - это сколько раз появляется письмо. Если он показывает, сколько раз встречается буква, это частота каждой буквы. Это похоже на работу. Каков твой вопрос?
 Drakosha14 июн. 2009 г., 10:11
В чем вопрос? Обратите внимание, что вы сканируете шифрфильтр 26 раз!

Ответы на вопрос(3)

относительная частота буквы c, вам придется разделить количество вхождений c на длину ввода.

Например, принимая пример Адама:

s = "andnowforsomethingcompletelydifferent"
n = len(s) # n = 37

и сохраняя абсолютную частоту каждой буквы в

dict[letter]

мы получаем относительные частоты:

from string import ascii_lowercase # this is "a...z"
for c in ascii_lowercase:
    print c, dict[c]/float(n)

сложив все вместе, мы получим что-то вроде этого:

# get input
s = "andnowforsomethingcompletelydifferent"
n = len(s) # n = 37

# get absolute frequencies of letters
import collections
dict = collections.defaultdict(int)
for c in s:
    dict[c] += 1

# print relative frequencies
from string import ascii_lowercase # this is "a...z"
for c in ascii_lowercase:
    print c, dict[c]/float(n)
 Jason Sundram29 нояб. 2011 г., 21:36
Вы не должны использоватьdict как имя переменной.
import collections

d = collections.defaultdict(int)
for c in 'test':
    d[c] += 1

print d # defaultdict(<type 'int'>, {'s': 1, 'e': 1, 't': 2})

Из файла:

myfile = open('test.txt')
for line in myfile:
    line = line.rstrip('\n')
    for c in line:
        d[c] += 1

Для гения этоdefaultdict контейнер, мы должны благодарить и хвалить. В противном случае мы все будем делать что-то глупое, как это:

s = "andnowforsomethingcompletelydifferent"
d = {}
for letter in s:
    if letter not in d:
        d[letter] = 1
    else:
        d[letter] += 1
 Jake14 июн. 2009 г., 10:13
defaultdict ... очень приятно!

Современный способ:

from collections import Counter

string = "ihavesometextbutidontmindsharing"
Counter(string)
#>>> Counter({'i': 4, 't': 4, 'e': 3, 'n': 3, 's': 2, 'h': 2, 'm': 2, 'o': 2, 'a': 2, 'd': 2, 'x': 1, 'r': 1, 'u': 1, 'b': 1, 'v': 1, 'g': 1})

Ваш ответ на вопрос