统计一篇小说中各单词出现的次数
最近在学习网易云课堂上面的一门课,上面有一道测验题我觉得很有意思,记录了下来。
作业详情:
统计 THE TRAGEDY OF ROMEO AND JULIET (罗密欧与朱丽叶)英文小说中各单词出现的次数。小说TXT文件下载链接:
链接:https://pan.baidu.com/s/1u2c7O-617MboXSwBHnoOcA 提取码:vX47
这是一道运用到Python基础知识的题,难点有四个:
一、要能正确打开文件 。
二、正确分解出单词列表,如 ['THE', 'TRAGEDY', 'OF', 'ROMEO', 'AND', 'JULIET', 'by', 'William', 'Shakespeare']。
三、正确得到单词频次字典,如 {'straight;': 1, 'noise.': 1}。
四、按单词频次逆序输出结果,如 (601, 'the'), (549, 'I'), (468, 'and'), (451, 'to')。
我的代码如下:(使用anaconda3中的Jupyter Notebook编辑)
with open(r'C:\Users\17964\Desktop\Work\123456.txt','rb') as file: #打开文件,“rb”以二进制文件打开。 content = file.read() str = content.split() #拆分字符串,返回字符串列表 Lz = dict() #创建字典数据对象,字典名字为Lz for s in str: #遍历拆分好的字符串 Lz[s] = Lz.get(s,0) + 1 #设置键/值 ,当第一次遇到新的s时,将新的s添加到字典中,并初始化其对应数值为0 ,然后+1,即该已经出现过一次, 第二次遇到同一个s时,返回对应的数值(此时括号内的0不起作用,因为已经初始化过了),然后+1输入。 +1是每一次都会起作用的,因为不管遇到字典内已经存在的或者不存在的,都需要把这个元素记录下来。 f = zip(Lz.values(),Lz.keys()) #序列合并,返回zip对象,交换键值对的位置 sorted(f,reverse = True) #逆序输出
里面有几个函数我觉得需要重点学习下:
1、split()
将一个字符串分裂成多个字符串组成的列表。通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则仅分隔 num 个子字符串。当不带参数时以空格进行分割,当代参数时,以该参数进行分割。
2、get()
从字典 中get() 函数返回指定键的值,如果值不在字典中返回默认值,默认为None。
3、zip()
(1)将两个序列合并,返回zip对象,可强制转换为列表或字典。
(2)将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。若传入参数的长度不等,则返回列表的长度和参数中长度最短的对象相同。传入参数的长度不等,则返回列表的长度和参数中长度最短的对象相同。
(3)zip()配合*号操作符,可以将已经zip过的列表对象解压。
(4)结合使用zip( )和dict( )可以很方便的反转字典(交换键值对的位置)。
4、sorted()
对序列进行排序,返回一个排序后的新列表,原数据不改变。reverse的排序规则:reverse = True 降序 , reverse = False 升序,有默认值。
受限笔者微薄的知识基础,难免有错误,欢迎指正。