Я смотрел на подобные темы, но ни одно решение, которое я не могу найти, в точности совпадает с тем, что я пытаюсь достичь.
У меня есть зашифрованный текст, который должен пройти простую замену букв на основена частоте появления каждой буквы в тексте.У меня уже есть функция для нормализации текста (строчные буквы, без буквенных символов, нет, количество встречаемых букв и затем получение относительной частоты каждой буквы. Буква - это ключ в словаре, а частота - это значение.
У меня также есть ожидаемые буквенные частоты для AZ в отдельном словаре (k = буква, v = частота), но я немного озадачен тем, что делать дальше.
Что я думаюМне нужно сделать, это взять нормализованный зашифрованный текст, ожидаемую букву freq dict [d1] и зашифрованную букву freq dict [d2] и перебрать их следующим образом (часть psuedocode):
for word in text:
for item in word:
for k,v in d2.items():
if d2[v] == d1[v]:
replace any instance of d2[k] with d1[k] in text
decoded_text=open('decoded_text.txt', 'w')
decoded_text.write(str('the decoded text')
ЗдесьЯ хочу взять текст и сказать: «Если значение в d2 совпадает со значением в d1, замените любой экземпляр d2 [k] на d1 [k] в тексте».
Я понимаю, что, должно быть, сделалтам довольно много базовых ошибок логики Python (я относительно новичок в Python), но я на правильном пути?
Заранее спасибо
Обновление:
Спасибоза все полезные предложения. Я решилЯ решил попробовать метод Карла Кнехта с некоторыми изменениями, чтобы вписаться в мой код.Однако, у меня все еще есть проблемы (полностью в моей реализации)
Я сделал функцию декодирования, чтобы взять рассматриваемый файл зашифрованного текста.Это вызывает ранее созданную функцию подсчета, которая возвращает словарь (буква: частота в виде числа с плавающей запятой).Это означало, что код «make uppercase version» не будет работать, так как k и v не являются float и не могут принимать .upper в качестве атрибута.Таким образом, вызов этой функции декодирования возвращает частоты букв зашифрованного текста, а затем сам зашифрованный текст, все еще закодированный.
def sorted_histogram(a_dict):
return [x[1] for x in sorted(a_dict.items(), key=itemgetter(1))]
def decode(filename):
text=open(filename).read()
cipher=text.lower()
cipher_dict=count(filename)
english_histogram = sorted_histogram(english_dict)
cipher_histogram = sorted_histogram(cipher_dict)
mapping = dict(zip(english_histogram, cipher_histogram)
translated = ''.join(
mapping.get(c, c)
for c in cipher
)
return translated