[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第15讲。
统计字母数量,本题是2019年~2020年举办的第11届蓝桥杯青少组Python编程选拔赛真题(具体日期不详),题目要求编写程序统计三行文字中各字母出现的次数并打印出来。
先来看看题目的要求吧。
一.题目说明
编程实现:
连续输入由英文字母组成的三行文字(每行文字不少于 10个字符,中间有空格和英文标点符号),以回车键结束一行文字的输入。
然后统计这三行文字中各字母出现的次数(不区分大小写),并以如下样例所示的方式输出各字母出现的次数(没有出现的字母不显示)。
输入描述:
三行英文文字,每行文字的输入以回车键结束。
输出描述:
1). 将输入的三行文字拼接在一起输出;
2). 换行输出文字中出现的英文字母(不区分大小写)的大写,且按字母表顺序排序、相邻字母问距相同;
3). 再换行在大写字母下方输出其在文字中出现的次数。
输人样例:
请输入第1行英文文字:I love you. my baby.
请输入第2行英文文字:You are a good boy.
请输入第3行央文文字:We are very happy with you.
输出样例:
评分标准:
-
8分:正确将三行文字拼接在一起输出;
-
10分:正确输出一行大写英文字母(文中出现的字母),且按字母表顺席排序、间距相同:
-
12 分:在大写字母下方输出各字母在文中出现的次数,且一一对应(不要求按字母表顺序排序)。
二.思路分析
这是一道字符串处理的题目,考查的知识点包括循环、字符串运算和字典的灵活运用。
题目要求输出两个内容,一是合并之后的字符串,二是每个字母出现的次数。
对于第一个问题,非常的简单,直接使用连接运算处理即可,这里的难点是第二个问题。
每个字母都需要统计对应的次数,如图所示:
看到这种表格,你想到了什么?
相信聪明的你,已经想到了,这不就是字典吗。
是的,本题需要用到字典这种数据结构,确定了数据结构,接下来就需要考虑该如何着手解决问题。
根据题目的描述,我们可以分成如下4个步骤:
-
构造字典
-
遍历字符串,统计字母数量
-
过滤字典
-
分别输出字典的键和值
首先是第一步,构造字典。
我们需要构造一个由26个大写字母构成的字典,如下:
{'A' : 0, 'B' : 0, 'C' : 0, 'D' : 0, ......}
构造的方法有两种,一种是按照上面的格式直接书写,第二种是借助ASCII码,结合chr()函数和循环来构造,很显然第二种方式更为简单,前提是你已经掌握了chr()函数。
接着是第二步,遍历字符串,统计字母数量。
其过程也比较简单,就是使用循环,对字符进行逐个处理,只是要注意两点,一是非字母字符无需处理,二是要将字母转换成大写字母。
我们可以借助字符串相关的方法来实现,如下:
isalpha():判断是否为字母
upper():将字母转成大写
第三步,过滤字典。
我们的字典包含26个字母,统计完成之后,有些字母的数量仍然为0,需要将其过滤掉,这可以结合循环来实现。
最简单的方法莫过于使用字典推导式了,基本用法如下:
{key:value for (key,value) in dict.items() if condition}
第四步,分别输出字典的键和值。
这一步就比较简单了,由于键和值是分两行输出的,所以我们需要分别获取字典的键和值,可以使用如下两个方法:
dict.keys(): 获取字典的键,返回列表
dict.values():获取字典的值,返回列表
在输出的时候,使用空格分开即可。
思路有了,接下来,我们就进入具体的编程实现环节。
三.编程实现
根据上面的思路分析,我们编写代码如下:
代码不难理解,再强调4点:
1). 对于这里的chr()函数,如果不记得的话,可以直接写出整个字典;
2). 对于这里的isalpha()函数,如果不记得的话,也可以直接使用字符比较,如下:
'a' <= c <= 'z' or 'A' <= c <= 'Z'
3). 字母之间有一定的间隔,可以直接使用转义字符'\t',也可以直接打空格,数字之间也是如此;
4). 字母全部输出后,需要使用print()函数单独输出一个换行。
运行程序,输入样例中的数据,效果如下:
至此,整个程序就全部完成了,你可以输入不同的字符串测试效果。
四.总结与思考
本题的分数为30分,代码在20行左右,涉及到的知识点包括:
-
循环语句,主要是for...in循环;
-
字符串操作;
-
字典的灵活运用;
-
输入输出处理;
题目难度中等,难点有两个,一是要熟练掌握字符串的基本操作,包括连接运算、chr()、isalpha()和upper()等方法。二是字典的灵活运用,不但要理解字典的特点,同时还要熟悉字典的基本操作,尤其字典推导式的使用,可以极大地节省代码量。
ASCII码是学习编程的基础,必须要非常的熟悉,包括常见字符对应的ASCII值,以及ASCII码与字符之间的相互转换。
在比赛的时候,是不能查阅任何资料的,这就要求每位同学在学习编程时,要多加练习,熟练掌握Python的基础知识,平时多一些努力,竞赛时就多一分轻松。
你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄
需要源码的,可以移步至“超平的编程课”gzh。