一、原题

参考编程模板,完善代码,实现以下功能。‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪‪‫
利用 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,这样可以提升程序运行的效率,避免了因忘记关闭文件而程序报错的情况。

四、学后反思

  1. 学习要有日拱一卒的精神,坚持自己先审题、分析、做题、写代码,然后对比参考答案,找到自己存在的不足,想想如何改进自己,或者如何优化参考答案。
  2. 可以用with open(),writelines和列表推导式优化代码,提升程序运行效率。