前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 字母频率映射

Python 字母频率映射

原创
作者头像
华科云商小徐
发布2024-04-02 11:23:09
1040
发布2024-04-02 11:23:09
举报
文章被收录于专栏:小徐学爬虫小徐学爬虫

要创建一个Python程序来计算字符串中字母的频率映射,你可以使用字典来存储每个字母的计数。如果你遇到下面的这样问题,可以像我们一样的解决方法。

1、问题背景

我有一个 Python 脚本,可以读取一个加密的文本文件并以多种方式解密它。我正在尝试添加的最后两个选项是映射文件中出现频率最高的字母和英语中最常见的字母。以下是显示频率的先前函数:

代码语言:javascript
复制
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)]

以下是还需要我完成的下一部分内容的说明:

函数 3:

将文本中最常出现的字母映射到英语中最常出现的字母(降序排列)。

[加密文本中的字母] -> [英语中的字母]

函数 4:

允许用户手动编辑频率映射。

我该如何着手做呢?我有点困惑,尤其是映射部分,至少要组合两个频率并允许编辑。

2、解决方案

首先,你需要将你的代码变成真正的有效 Python 代码。例如,你的函数必须使用参数列表定义。

然后,你要做的就是返回值,而不是只打印它们。

此外,你不需要元组频率的字符串表示,而是可以比较的实际元组。

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

事实上,如果你仔细观察,functTwo 是完全没有必要的——它实际上是在计算一个常量,所以你也可以在模块级别进行计算。

同时,我将重新组织 functOne 以使其将输入作为参数。关闭文件,而不是泄露它。并为函数提供有意义的名称。

代码语言:javascript
复制
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 对象(这意味着你可能想使用列表而不是元组),并重新构建 english_letters(这意味着你可能希望在函数中实现它)。

在这个示例中,letter_frequency函数接受一个字符串作为输入,并返回一个字典,其中键是字母,值是对应的频率。函数首先创建一个空字典frequency_map,然后遍历输入文本中的每个字符。对于每个字母字符,它会将其转换为小写,并将其添加到字典中。如果字母已经存在于字典中,则增加其计数;否则,在字典中创建该字母并将计数设置为1。最后,函数返回字母频率映射字典。

你可以将这个函数应用于任何字符串,以计算其中字母的频率映射。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档