Python字母频率映射

时间:2013-11-12 03:45:41

标签: python

我有一个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)"

以下是我需要为接下来的两个做些什么的描述:

  

功能3:

     

将文本中最常用的字母按降序排列在英语中最常用的字母。

     

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

     

功能4:

     

允许用户手动编辑频率图

我该怎么做呢?我有点迷失在地图部分,至少梳理两个频率并允许编辑。

1 个答案:

答案 0 :(得分: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对象(这意味着你可能想要使用list而不是tuple)并从中重建english_letters(这意味着毕竟你可能想要一个函数。