我看过类似的主题,但没有找到与我想要达到的目标完全匹配的解决方案。
我有一个密文,需要根据文本中每个字母出现的频率进行简单的字母替换。我已经有一个函数来规范化文本(小写,没有非字母字符,没有,计数字母出现然后得到每个字母的相对频率。字母是字典中的键,频率是值。
我在单独的字典中也有 AZ 的预期字母频率(k=字母,v=频率),但我对接下来要做什么有点困惑。
我认为我需要做的是获取规范化的密文、预期的字母频率字典 [d1] 和密码字母频率字典 [d2] 并按如下方式迭代它们(部分伪代码):
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 方面相对较新),但我在正确的轨道上吗?
提前致谢
更新:
感谢您提供所有有用的建议。我决定尝试 Karl Knechtel 的方法,并进行一些更改以适应我的代码。但是,我仍然遇到问题(完全在我的实施中)
我已经制作了一个解码功能来获取有问题的密文文件。这会调用之前创建的 count 函数,该函数返回一个字典(字母:频率为浮点数)。这意味着“制作大写版本”代码不起作用,因为 k 和 v 不是浮点数并且不能将 .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