2015-04-17 2 views
0

В принципе, мне была назначена задача подсчитать, сколько раз каждая буква в алфавите встречается в фрагменте зашифрованного текста. Как только это будет сделано, частота каждой буквы будет помещена в порядке убывания. Например, [(l, 2), (e, 1), {h, 1), (o: 1)]. Это я сделал, и он работает.Помощь в анализе частоты

Затем каждая буква в нисходящем списке должна быть заменена соответствующей буквой в этой строке: 'etaoinshrdlcumfwgypbvkjxqz' Вот что я не знаю, как это сделать.

До сих пор у меня есть это:

enc_text = input("Enter Encrypted Text: ").lower() 

count = {'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 char in enc_text: 
if char.isalpha(): 
    count[char] += 1 

print(enc_text) 
print(count) 

def get_value(count): 
    return count[1] 


sorted_text = sorted(count.items(), key = get_value) 


descending_text = reversed(sorted_text) 
descending_text = list(descending_text) 
print(descending_text) 


most_frequent = {'e': 1, 't': 2, 'a': 3, 'o': 4, 'i': 5, 'n': 6, 's': 7, 'h': 8, 'r': 9, 'd': 10, 'l': 11, 'c': 12, 'u': 13, 'm': 14, 'w': 15, 'f': 16, 'g': 17, 'y': 18, 'p': 19, 'b': 20, 'v': 21, 'k': 22, 'j': 23, 'x': 24, 'q': 25, 'z': 26} 


letters = list('abcdefghijklmnopqrstuvwxyz') 
etaoin = list('etaoinshrdlcumfwgypbvkjxqz') 

Я считаю, что я должен петлю над текстом в начале и посмотреть на него по буквам. Затем каждая буква должна быть заменена буквой в строке? Но я не уверен, как его реализовать.

Заранее спасибо за любую помощь

+0

Для некоторых интересных примеров и поддержки библиотеки вы можете посмотреть здесь: https://docs.python.org/2/library/collections.html#collections.Counter – Pynchia

+0

Вы решили свою проблему? Было бы приятно услышать решение :) – Mailerdaimon

ответ

0

Вы холодильный контур над зашифрованным текстом и посмотреть на символ в списке нисходящего с помощью list.index() и получить соответствующий символ в этой позиции из списка etaoin.

Пример:

decryptedChar = eatoin[descending.index(encryptedChar)] 
0

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

decryption_map = {} 
for index, key in enumerate(sorted(count.items(), key = get_value)): 
    decryption_map[key] = etaoin[index] 
print ''.join(map(lambda x : decryption_map[key], list(enc_text))) 
0

Это даст вам замену карты. Продолжение от последней части вашего кода (сделал etaoin строку):

etaoin = "etaoinshrdlcumfwgypbvkjxqz" 

rev_etaoin = etaoin[::-1] 
replacement_map = sorted_text[:] 
for i in range(26): 
    replacement_map[i] = (sorted_text[i][0],rev_etaoin[i]) 
print(replacement_map) 

Выход:

[('c', 'z'), ('b', 'q'), ('e', 'x'), ('g', 'j'), ('f', 'k'), ('i', 'v'), ('k', 'b'), ('m', 'p'), ('l', 'y'), ('o', 'g'), ('n', 'w'), ('p', 'f'), ('u', 'm'), ('t', 'u'), ('w', 'c'), ('v', 'l'), ('x', 'd'), ('z', 'r'), ('h', 'h'), ('q', 's'), ('r', 'n'), ('y', 'i'), ('j', 'o'), ('s', 'a'), ('d', 't'), ('a', 'e')] 
0

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

rank_dict = {} 
for i in range(26): 
    rank_dict[sorted(count, key=count.get, reverse = True)[i]] = i+1 
print rank_dict 

Так [(л, 2), (е, 1), {ч, 1), (о: 1)] вместо этого будет rank_dict = { 'л': 1 :, 'е': 2, 'h': 3, 'o': 4}. Если вы тогда имели наиболее частые Dict наоборот

freq_dict = {1: 'e', 2: 't', 3: 'a', 4: 'o', 5: 'i', 6: 'n', 7: 's', 8: 'h', 9: 'r', 10: 'd', 11: 'l', 12: 'c', 13: 'u', 14: 'm', 15: 'f', 16: 'w', 17: 'g', 18: 'y', 19: 'p', 20: 'b', 21: 'v', 22: 'k', 23: 'j', 24: 'x', 25: 'q', 26: 'z'} 

, то вы могли бы перебрать зашифрованный текст с:

dec_text = '' 
for char in enc_text: 
    dec_text = dec_text + freq_dict[rank_dict[char]] 

В качестве альтернативы, если вы хотите сохранить ваш most_frequent ключа Dict: значение ток наоборот, используйте:

dec_text = dec_text + [key for key in most_frequent \ 
         if most_frequent[key] == rank_dict[char]] 

Обратите внимание, что случаи, когда несколько букв встречаются с той же частотой, в настоящее время ранжированных в алфавитном порядке по сортировке/сортировке. Если ваш текст длинный, и вы просто используете его в качестве руководства для дешифрования шифров подстановки, это хорошо, но скорее всего будут ошибки в расшифрованном тексте.

Смежные вопросы