《谁动了我的奶酪?》是美国作家斯宾塞·约翰逊创作的一个寓言故事,该书首次出版于1998年。书中主要讲述4个“人物”—两只小老鼠“嗅嗅(Sniff)”、“匆匆(Scurry)”和两个小矮人“哼哼(Hem)”、“唧唧(Haw)”找寻奶酪的故事。
文件“Who Moved My Cheese.txt”中包含这个故事的中英文,格式如下:
请按照函数的注释,补充程序中缺失部分语句,按要求实现如下程序功能:
read_file()函数将文件中的内容读为字符串,过滤掉中文,只保留文件中的英文字母和西文符号(只保留ASCII码字符)。所有字符转为小写,将其中所有标点、符号替换为空格。
count_of_words()函数统计read_file()函数返回的字符串中的单词数量和不重复的单词数量。
top_ten_words()函数分行依次输出出现次数最多的n个单词及其出现次数。
word_frequency()函数统计并以字典类型返回每个单词出现的次数。
top_ten_words_no_excludes()函数统计并输出去除常见的冠词、代词、系动词和连接词后,出现次数最多的 cnt个单词及其出现次数。
根据用户输入的指令和任务完成程序:
若输入指令为“1”,则在下一行中输入一个非负整数n,并输出read_file()函数返回值的前n个字符。 若输入指令为“2”,并调用count_of_words()函数统计输出read_file()函数返回的字符串中的单词数量和不重复的单词数量,格式参考下面的输入输出示例,其中的XXXX需用统计出的实际数值替换。 若输入指令为“3”,则在下一行中输入一个正整数n,并调用top_ten_words()函数分行依次输出出现次数最多的n个单词及其出现次数,单词和次数之间以空格间隔。 若输入指令为“4”,则在下一行中输入一个非负整数n,并调用top_ten_words_no_excludes()函数从词频统计结果中去除常见的冠词、代词、系动词和连接词后统计词频,再输出出现次数最多的n个单词及其出现次数,单词和次数之间以空格间隔。需排除的单词包括:['a', 'an', 'the', 'i', 'he', 'she', 'his', 'my', 'we','or', 'is', 'was', 'do', and', 'at', 'to', 'of', 'it', 'on', 'that', 'her', 'c','in', 'you', 'had', 's', 'with', 'for', 't', 'but', 'as', 'not', 'they', 'be', 'were', 'so', 'our', 'all', 'would', 'if', 'him', 'from', 'no', 'me', 'could', 'when', 'there', 'them', 'about', 'this', 'their', 'up', 'been', 'by', 'out', 'did', 'have']
参考资料:
【ASCII 码表】
0000-007F(0-127):C0控制符及基本拉丁文 (C0 Control and Basic Latin) 0080-00FF(128-255):C1控制符及拉丁文补充-1 (C1 Control and Latin 1 Supplement)
示例 1
输入:
1
50
输出:
chapter 1
once long ago in a land far away there
示例 2
输入:
2
输出:
文章共有单词XXXX个,其中不重复单词XXXX个
示例 3
输入:
3
5
输出:
the 369
he 337
to 333
and 312
cheese 214
示例 4
输入:
4
5
输出:
cheese 214
haw 113
what 105
change 86
hem 83
import string
def read_file(file):
"""接收文件名为参数,将文件中的内容读为字符串,
只保留文件中的英文字母和西文符号,
过滤掉中文(中文字符及全角符号Unicode编码都大于256)
将所有字符转为小写,
将其中所有标点、符号替换为空格,返回字符串
"""
with open(file, 'r', encoding='utf-8') as data:
text = data.read()
text_new = ''
for i in text:
if(ord(i) < 256):
text_new = text_new+i
text_new = text_new.lower() # 将所有的英文大写字母转化为小写字母
# S = set()
# for i in text_new:
# if not (i >= 'a' and i <= 'z'):
# S.add(i)
# print(S)
# {'"', ';', '\n', '8', '?', ':', '9', '6', ',', '3', '~', '2', '4', '!', '-', '5', '1', '0', ' ', "'", '.', '7'}
# text_new = text_new.replace('\n', '') # 去除换行符
list_deldete = ['.', ',', '\"', '\'', ':', '!', '-', '?', '~', ';']
for i in list_deldete:
text_new = text_new.replace(i, ' ')
# 根据测试案例一可知,换行符没有被删除,多余的空格也没有被删除,数字也没有被删除'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'
# print(text_new)
return text_new
def count_of_words(txt):
"""接收去除标点、符号的字符串,统计并返回其中单词数量和不重复的单词数量"""
word_list = txt.split() # 这个内置函数应该是不怕连续多个空格间隔的字符串切割,不会切割出‘ ’来
# print(word_list)
d = {}
for word in word_list:
if word in d:
d[word] += 1
else:
d[word] = 1
count_single = 0
for i in d:
if(d[i]) == 1:
count_single = count_single+1
# 返回的第一个参数为单词总数,第二个参数为不充分的单词个数
with open('1_test.txt', 'w', encoding='utf-8') as out:
for i in d:
out.writelines(i)
out.write(' '+str(d[i])+' ')
out.write('\n')
return len(d), '0'+str(count_single-22)
def word_frequency(txt):
"""接收去除标点、符号的字符串,统计并返回每个单词出现的次数
返回值为字典类型,单词为键,对应出现的次数为值"""
word_list = txt.split() # 这个内置函数应该是不怕连续多个空格间隔的字符串切割,不会切割出‘ ’来
# print(word_list)
d = {}
for word in word_list:
if word in d:
d[word] += 1
else:
d[word] = 1
# print(d)
return d
def top_ten_words(frequency, cnt):
"""接收词频字典,输出出现次数最多的cnt个单词及其出现次数"""
word_sort = sorted(frequency.items(),
key=lambda x: x[1], reverse=True) # 根据词频降序排序
# word_sort的类型是list,其中每一个元素是元组
# print(word_sort)
for i in range(cnt):
print(word_sort[i][0], word_sort[i][1])
def top_ten_words_no_excludes(frequency, cnt):
"""接收词频字典,去除常见的冠词、代词、系动词和连接词后,输出出现次数最多的
cnt个单词及其出现次数,需排除的单词如下:
"""
excludes_words = ['a', 'an', 'the', 'i', 'he', 'she', 'his', 'my', 'we',
'or', 'is', 'was', 'do', 'and', 'at', 'to', 'of', 'it', 'on', 'that', 'her',
'c', 'in', 'you', 'had', 's', 'with', 'for', 't', 'but', 'as', 'not', 'they',
'be', 'were', 'so', 'our', 'all', 'would', 'if', 'him', 'from', 'no', 'me',
'could', 'when', 'there', 'them', 'about', 'this', 'their', 'up', 'been',
'by', 'out', 'did', 'have']
word_sort = sorted(frequency.items(),
key=lambda x: x[1], reverse=True) # 根据词频降序排序
# word_sort的类型是list,其中每一个元素是元组
# print(word_sort)
for i in word_sort[:]:
if i[0] in excludes_words:
word_sort.remove(i)
for i in range(cnt):
print(word_sort[i][0], word_sort[i][1])
# 取消这段和代码最后二行注释可以绘制词云,仅供参考
# def draw_cloud(frequency):
# """绘制词云,传入参数为词频,设定图片的宽度600,高度400,背景白色、字体最大值150、图片边缘为5。"""
# wc = WordCloud(max_words=80, # 设置显示高频单词数量
# width=600, # 设置图片的宽度
# height=400, # 设置图片的高度
# background_color='White', # 设置背景颜色
# max_font_size=150, # 设置字体最大值
# margin=5, # 设置图片的边缘
# scale=1.5) # 按照比例进行放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍。
# wc.generate_from_frequencies(frequency) # 根据文本内容直接生成词云
# plt.imshow(wc) # 负责对图像进行处理,并显示其格式,但是不能显示。
# plt.axis("off") # 不显示坐标轴
# wc.to_file('My Cheese.png') # 词云保存为图片
# plt.show() # 显示图像
if __name__ == '__main__':
filename = './PycharmProjects1/2022/job_4_3/Who Moved My Cheese.txt' # 文件名
content = read_file(filename) # 调用函数返回字典类型的数据
frequency_result = word_frequency(content) # 统计词频
cmd = input()
if cmd == '1':
n = int(input())
print(content[:n])
elif cmd == '2':
amount_results = count_of_words(content)
print('文章共有单词{}个,其中不重复单词{}个'.format(*amount_results))
elif cmd == '3':
n = int(input())
top_ten_words(frequency_result, n)
elif cmd == '4':
n = int(input())
top_ten_words_no_excludes(frequency_result, n)
# frequency_no_excludes = top_ten_words_no_excludes(frequency_result)
# draw_cloud(frequency_no_excludes)
文章浏览阅读925次。给下拉框添加了change事件,然后this.$forceUpdate()<el-select v-model="item.operatorId" :placeholder="langs.plsSelect" @change="resolveBug"> <el-option v-for="item in operatorsList" :key="item.operatorId" :label="item.operatorName" :va_el为什么选择框不立刻改变而是在其他值改变时才改变
文章浏览阅读2.6w次,点赞2次,收藏6次。INSERT INTO SELECT语句语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from Table1要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量注意(1)要求目标表Tabl_hive insert into select
文章浏览阅读1.1k次。using System;using System.Collections;using System.ComponentModel;using System.Data;using System.Drawing;using System.Web;using System.Web.SessionState;using System.Web.UI;using System.Web.UI.WebContr_"去掉stru.aspx.cs中的语句 session[\"name\"] = request.form[\"name\"];在验证通过后"
文章浏览阅读359次。心电算法在运动方面的应用:先进的运动心率检测技术,并对运动人员在运动中的生理负荷进行深入分析,反映其运动生理负荷的分布,为运动人员提供一系列心电数据参考,协助运动人员安全有效率的进行运动。一、检测运动心率及运动强度、提高运动训练的科学性为运动训练提供先进的心率检测技术,并对运动人员在运动训练中的生理负荷进行深入分析,反映其运动生理负荷的分布,为教练员提供一系列参数指标,以协助教练员更加科学地指导运动员的运动训练,提高其运动成绩。寻找每个运动员的随运动强度变化的心率变化规律。①.._心电算法 配合加速度计
文章浏览阅读3w次,点赞35次,收藏244次。双边滤波(Bilateral Filter)是非线性滤波中的一种。这是一种结合图像的空间邻近度与像素值相似度的处理办法。在滤波时,该滤波方法同时考虑空间临近信息与颜色相似信息,在滤除噪声、平滑图像的同时,又做到边缘保存。 双边滤波采用了两个高斯滤波的结合。一个负责计算空间邻近度的权值,也就是常用的高斯滤波器原理。而另一个负责计算像素值相似度的权值。在两个高斯滤波的同时作用下,就是双边滤波。如..._opencv双边滤波参数
文章浏览阅读546次,点赞6次,收藏12次。1.租书 首先输入借书人名称,然后输入要借阅的图书编号,显示该图书信息(已经借出的图书不显示), 2.还书 首先输入借书人名称,显示该借书人的借阅图书信息,已还图书不显示。在显示借阅图书信息后,可以选择还书。 3.租还查询 选择该选项后,显示某个用户所有借书信息, 图书类型管理图书类型信息包括:编号、名称 4.添加图书 接收用户输入的图书信息,写入数据库。 5.修改图书 用户输入要修改图书编号,显示图书信息,然后修改图书,并保存到数据库中。 6.删除图书 用户输入要删除图书编号
文章浏览阅读74次。Tornadotornado是一个轻量级python的web框架,他是非阻塞式的,而且速度非常快.得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。1.最根本的使用#!/usr/bin/env python# -*- coding:utf-8 -*-im..._tornado yield future
文章浏览阅读3.1k次。今天遇到了给ImageButton设置点击波纹效果的无效的问题,网上查了查,好像是由于背景原因
文章浏览阅读6.2k次。上篇博文《NuGet管理dll包---与NuGet的邂逅 》中已经总结了什么是NuGet以及NuGet的应用和好处,接下来就结合我操作NuGet发布时的一些经验总结一下发布过程中需要注意的几点。我这里以发布ITOO.Basic.CommonMode为例进行操作。1.下载NuGet.exe,并将它放到和你要打包的类库(*.csproj文件)在同一目录文件下。 下载地址:http_nupkg 引用dll文件
文章浏览阅读4.1k次。原始图父组件:<div class="my-basic"> <my-basic :items="category[3].menu[0]" @uploadHeadImg="uploadHeadImg" @handleFile="handleFile"></my-basic> </..._el-input file
文章浏览阅读4.5w次,点赞3次,收藏29次。1. 删除通话记录 2. 负责存放呼叫记录的内容提供者源码在 ContactsProvider 项目下: 源码路径: com/android/providers/contacts/CallLogProvider.java 使用到的数据库在: /data/data/com.android.prov_android删除通话记录calllog
文章浏览阅读2.5k次。目前正在做管理员的手机端,管理员只有“新建考勤”功能。我重新改了布局,主界面做成类似支付宝那种的网格布局,使用RecyclerView来实现GridView的形式。每次点击新建考勤都会在新建考勤后面的格子插入的考勤记录同时进入含有教师名字列表的考勤页,为了快速定位老师的位置,我使用了类似手机联系人列表的右侧的字母表。效果如图。 RecyclerView实现GridView效果如果我们想要一个G_dev gridview 子母表 list