-4

我有一个 Python 脚本,它读取一个加密的文本文件并以各种方式解密它。我要添加的最后两个选项是绘制文件中最常见的字母和英语中最常见的字母。

这是我以前显示频率的函数:

def functOne:
    Crypt = input("what file would you like to select? ")
    filehandle = open(Crypt, "r")
    data = filehandle.read().upper()
    char_counter = collections.Counter(data)
    for char, count in char_counter.most_common():
        if char in string.ascii_uppercase:
            print(char, count)

def FunctTwo: 
    print "Relative letter Freq of letters in English Language A-Z; ENGLISH = (0.0749, 0.0129, 0.0354, 0.0362, 0.1400, 0.0218, 0.0174, 0.0422, 0.0665, 0.0027, 0.0047, 0.0357, 0.0339, 0.0674, 0.0737, 0.0243, 0.0026, 0.0614, 0.0695, 0.0985, 0.0300, 0.0116, 0.0169, 0.0028, 0.0164, 0.0004)"

以下是我需要为接下来的两个做的事情的描述:

功能三:

按降序将文本中最常见的字母映射到英语中最常见的字母。

[letter in cryptogram] -> [letter in english language]

功能四:

允许用户手动编辑频率图

我该怎么做呢?我有点迷失在映射部分,至少结合了两个频率并允许编辑。

4

1 回答 1

2

首先,您必须将您的代码转换为实际有效的 Python 代码。例如,您的函数必须使用参数列表来定义。

然后,您要做的是返回值,而不仅仅是打印它们。

此外,您不需要频率元组的字符串表示,而是您可以使用的实际元组。

最后,您必须将这两个集合放入某种可以比较的格式。ENGLISH只是 26 个频率的序列;由 计算的值functOne是按频率降序排列的最多 26 个(字母、计数)对的序列。但实际上,我们根本不需要计数或频率。我们只需要按频率降序排列的字母。

事实上,如果你看一下,它functTwo是完全没有必要的——它实际上是在计算一个常数,所以你不妨在模块级别这样做。

当我们这样做时,我会重新组织functOne,以便它将输入作为参数。并关闭文件而不是泄漏它。并给函数起有意义的名字。

def count_letters(data):
    data = data.upper()
    char_counter = collections.Counter(data)
    return [char for char, count in char_counter.most_common()]

english_freqs = (0.0749, 0.0129, 0.0354, 0.0362, 0.1400, 0.0218, 0.0174, 
                 0.0422, 0.0665, 0.0027, 0.0047, 0.0357, 0.0339, 0.0674, 
                 0.0737, 0.0243, 0.0026, 0.0614, 0.0695, 0.0985, 0.0300, 
                 0.0116, 0.0169, 0.0028, 0.0164, 0.0004)
pairs = zip(english_freqs, string.ascii_uppercase)
english_letters = [char for count, char in sorted(pairs, reversed=True)]

def decrypt(data):
    input_letters = count_letters(data)
    return {input_letter: english_letter
           for input_datum, english_datum in zip(input_letters, english_letters)}

crypt = input("what file would you like to select? ")
with open(crypt, "r") as f:
    data = f.read()
mapping = decrypt(data)

对于编辑功能……您必须先设计您想要的界面,然后才能实现它。但大概您要编辑english_freqs对象(这意味着您可能想要使用 alist而不是 a tuple)并从中重建english_letters(这意味着您可能希望在函数中使用它)。

于 2013-11-12T04:00:55.907 回答