一、原题
参考编程模板,完善代码,实现以下功能。
利用 jieba 库实现中文分词。对分词后的列表进行去重处理,然后将分词结果中字符数大于等于 3 的词语,按照字符顺序排序,写入到文件 out1.txt 文件中。
out1.txt 文件中每一行是分词后的一个词语。形式如下所示:
二十一
美国麻省理工学院
语言学
形象思维
突破性
总的来说
思维科学
软硬件
尼尔逊
温斯顿
机器人
......
二、题目分析
原题主要考察:1. jieba分词 2. 文本的打开与写入 3. for 循环和if 条件判断。
算法:可以用open()来打开文件,jieba进行分词,获得句柄后用write写入,由于是按行写入,注意添加换行符。
另外题目中还提到要把结果去重,所以可以用set进行去重。
三、两种解法
1. 官方答案
答案:特点是紧扣大纲,中规中矩,代码易于理解,不好的是代码过多,有时可能会漏掉关闭文件。
# -*- coding:utf-8 -*-
'''
This is a python123.io file.
'''
import jieba #导入中文分词库
f = open('out1.txt','w') #以写的方式打开out1.txt文件
fi = open("data.txt","r",encoding="utf-8") #以读的方式打开data.txt文件
#使用jieba.lcut()对data.txt文件读出字符串进行中文分词,返回列表lst
lst = jieba.lcut(fi.read())
s = set(lst) #使用set函数将列表lst转换为集合,实现元素去重
s1 = sorted(s) #将列表按字符顺序排序
ls = list(s1) #将集合重新变成列表ls
for item in ls: #遍历去重后ls每一个元素
if len(item) >=3:
f.write(item + "\n") #将符合条件的字符串写入out1.txt中
fi.close() #关闭文件fi
f.close() #关闭文件f
2. 个人解法
主要是用列表推导式,把for循环、if条件写在了一起,最后用writelines写入文件
with open("data.txt","r",encoding="utf-8") as f:
text = f.read()
fenci = jieba.lcut(text)
lst = [elm for elm in fenci if len(elm)>=3] #去除字符长度小于3的短语
with open('out1.txt','w') as fi:
fi.writelines([i+"\n" for i in sorted(set(lst))]) #用writelines写入去重和排序后的列表。
个人解法比参考答案减少五行代码。主要原因在于用with open()取代了open,这样可以提升程序运行的效率,避免了因忘记关闭文件而程序报错的情况。
四、学后反思
- 学习要有日拱一卒的精神,坚持自己先审题、分析、做题、写代码,然后对比参考答案,找到自己存在的不足,想想如何改进自己,或者如何优化参考答案。
- 可以用with open(),writelines和列表推导式优化代码,提升程序运行效率。