编写程序,输入文本,并打印一个表格,显示每个不同单词在文本中出现的次数

本文介绍了一个简单的C++程序,用于统计并输出输入文本中每个单词的出现次数。通过使用标准库中的map容器,该程序能够有效地跟踪和更新单词频率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

编写程序,输入文本,并打印一个表格,显示每个不同单词在文本中出现的次数。
例如:
输入:
Welcome to C++ world ! Happy birthday to you .
输出:
单词 C++ 的个数为 : 1
单词 Happy 的个数为 : 1
单词 Welcome 的个数为 : 1
单词 birthday 的个数为 : 1
单词 to 的个数为 : 2
单词 world 的个数为 : 1
单词 you 的个数为 : 1

/*
输入几行文本,并打印一个表格,显示每个不同单词在文本中出现的次数
*/


#include <iostream>
#include <map>
#include <string>
#include <sstream>

using namespace std;

int main()
{
    string str,s;
    map<string,int> m;
    map<string,int>::iterator iter;

    cout<<"please input test: "<<endl;
    getline(cin,str);           //输入文本
    istringstream is(str);
    while(is>>s){               //提取字符串

        iter=m.find(s);         //查找s,并赋给迭代器
        if(iter!=m.end()){        //若字符串存在,则value+1
            iter->second++;
        }else{
            m.insert(make_pair(s,1));   //不存在则插入
        }

    }

    //把标点符号键值对删除
    m.erase("!");
    m.erase(",");
    m.erase(".");
    m.erase("?");

    //结束后遍历map
    for(map<string,int>::iterator it= m.begin();it!=m.end();it++){

        cout<<"单词 "<<it->first<<" 的个数为 : "<<it->second<<endl;

    }

    return 0;
}

<think>好的,我现在需要帮助用户解决一个Python问题,读取文件data.txt,统计每个单词出现的次数,并输出频率最高的前三个单词。首先,我得理解用户的需求。他们可能是一个刚开始学习Python的人,或者需要处理文本数据的学生或开发人员。用户希望得到一个清晰的解决方案,可能还需要代码的解析和解释,以确保他们能够理解每一步的作用。 接下来,我需要考虑如何分解这个问题。主要步骤应该是:读取文件、处理文本、统计词频、排序并输出结果。每个步骤中可能会有需要注意的地方,比如文件是否存在、如何处理大小写和标点符号、如何处理多个空格等。 首先,读取文件。用户可能不知道如何正确打开文件,特别是处理编码问题。所以代码中应该使用`with open`来确保文件正确关闭,同时指定编码,比如UTF-8,以避免常见的编码错误。如果文件不存在,程序会抛出异常,但用户可能需要更详细的错误处理,不过根据问题描述,可能暂时不需要,但可以作为一个扩展点提到。 然后是处理文本内容。需要将文本分割成单词,这里通常用split()方法,但默认的split()会根据空格分割,但可能无法处理标点符号和换符。因此,可能需要更细致的方法,比如使用正则表达式来匹配单词,忽略标点符号。比如使用re.findall(r'\b\w+\b', text.lower())来提取所有单词,并转换为小写,这样"The"和"the"会被视为同一个单词。 统计词频的话,可以用字典来记录每个单词出现的次数。或者使用collections模块中的Counter类,它提供了更简便的方法来统计可哈希对象。Counter的most_common(3)方法可以直接得到前三个最常见的元素,这会简化代码。 接下来是排序。如果不用Counter,可能需要手动对字典的项进排序,按值降序排列,然后取前三个。但使用Counter会更高效,代码更简洁。 输出结果时,需要确保格式清晰,比如打印单词和对应的次数。 然后,我需要考虑可能的边界情况,比如文件中有空,或者单词全部是标点符号,或者文件非常大。不过根据问题描述,用户可能只需要处理普通情况,所以暂时不需要处理大文件的情况,但可以提到如果文件很大,可能需要逐读取。 在编写代码时,需要注意代码的结构,比如函数的使用,增加代码的可读性和重用性。同时,异常处理也是必要的,比如文件找不到时的处理,但用户可能希望先看到基本实现,再考虑错误处理。 现在,回顾用户提供的示例代码,比如之前的线程问题,用户喜欢有详细的代码解析和分步骤说明。因此,我应该按照类似的格式来组织回答,包括代码、解析、示例输出、关键知识点和可能的扩展改进。 最后,测试代码是否可。比如创建一个data.txt文件,包含一些测试文本,运代码看是否输出正确的结果。例如,如果data.txt中有多次出现的单词,比如“hello world world python python python”,那么输出应该是python:3, world:2, hello:1,但需要根据实际内容调整。 总结,我需要提供一个使用Python读取文件、统计词频并输出前三的解决方案,并详细解释每个步骤,同时考虑用户的潜在需求,如代码的健壮性、扩展性等。</think>以下是用 Python 实现读取文件、统计词频并输出最高频前3个单词的代码及解析: --- ```python import re from collections import Counter def count_words(filename): try: # 读取文件内容 with open(filename, 'r', encoding='utf-8') as file: text = file.read().lower() # 转为小写统一格式 # 提取单词(忽略标点) words = re.findall(r'\b\w+\b', text) # 正则匹配单词边界 # 统计词频 word_counts = Counter(words) # 返回频率最高的前3个单词 return word_counts.most_common(3) except FileNotFoundError: print(f"错误:文件 {filename} 不存在") return [] # 执统计 top_words = count_words("data.txt") # 输出结果 if top_words: print("频率最高的前3个单词:") for word, count in top_words: print(f"{word}: {count}次") ``` --- ### **代码解析** 1. **文件读取** - 使用 `with open(...)` 安全读取文件,`encoding='utf-8'` 处理中文或其他字符 - `text.lower()` 将文本统一为小写,避免大小写差异导致的重复统计(如 "Apple" 和 "apple" 视为同一单词2. **单词提取** - `re.findall(r'\b\w+\b', text)` 通过正则表达式精准匹配单词: - `\b` 表示单词边界,确保正确分割单词 - `\w+` 匹配字母、数字和下划线组成的连续字符(可过滤大部分标点符号) 3. **词频统计** - `Counter(words)` 直接统计列表元素的出现次数 - `most_common(3)` 快速获取频率最高的前3项 4. **异常处理** - 捕获 `FileNotFoundError` 避免程序因文件缺失崩溃 --- ### **示例文件 `data.txt` 内容** ``` Hello world! Python is awesome. Python makes coding fun. Hello again. World is beautiful. ``` ### **输出结果** ``` 频率最高的前3个单词: hello: 2次 world: 2次 python: 2次 ``` --- ### **关键知识点** 1. **正则表达式优化** - 若需排除数字,可修改正则表达式为 `r'\b[a-zA-Z]+\b'` - 若需保留连字符词(如 "state-of-the-art"),使用 `r'\b[\w-]+\b'` 2. **性能扩展** - 处理大文件时,可逐读取避免内存溢出: ```python words = [] with open(filename, 'r') as file: for line in file: words.extend(re.findall(r'\b\w+\b', line.lower())) ``` 3. **去停用词** - 过滤无意义词汇(如 "the", "and"): ```python stop_words = {'the', 'and', 'is'} words = [word for word in words if word not in stop_words] ``` --- ### **扩展改进** - **并列排名处理**:若多个单词频率相同,可用排序扩展逻辑 - **输出格式化**:使用 `tabulate` 库生成表格化结果 - **多文件支持**:通过参数传递批量处理多个文件
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值