[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第49讲。
中位数和众数,本题是2021年1月23日举办的第12届蓝桥杯青少组Python编程选拔赛真题,题目要求编程对输入的一组数据,分别计算出平均数、中位数和众数。
先来看看题目的要求吧
一.题目说明
提示信息:
平均数:是指在一组数据中所有数据之和再除以这组数据的个数。如:“1,2,3,4,5” 这组数的平均数为3.00。(1 + 2 + 3 + 4 + 5) / 5 = 3.00
中位数:将一组数据从大到小排序后,位置在最中间的数值。
分两种情况:当数据个数为奇数时,中位数为中间的那个数的值;当数据个数为偶数时,中位数为中间的两个数的平均值。
如:“1,3,5,7,9 ”这组数据有5个数字,中位数为5; “1,3,5,7 ”这组数据有4个数字,中位数为4。
众数:是一组数据中出现次数最多的那个数值。
如:“1,3,5,7,9 ,9”这组数据9出现的次数最多,故众数为9。
编程实现:
给定一组正整数,然后分行输出这组正整数的平均数,中位数,众数。
输入描述:
输入一组正整数并以一个英文逗号隔开
输出描述:
第一行输出平均数(保留两位小数)
第二行输出中位数(保留两位小数)
第三行输出众数(如果有多个数值出现的次数相同,则取数值最大的作为众数)
样例输入:
1,3,5,7,9,9
样例输出:
5.67
6.00
9
二.思路分析
这是一道和数学相关的计算题,考查的是平均数、中位数和众数,涉及的知识点主要包循环、列表、排序和函数等。
平均数、中位数和众数这3个数值之间并没有直接关联,因此,我们可以分开处理。
其中,平均数最简单,直接对列表数据求和,再除以列表的长度即可。
中位数是指一组数据中的中间值,即将一组数据按照从小到大(或者从大到小)的顺序排列后,处于中间位置的数,在这组数据中,有一半的数据比中位数大,有一半的数据比中位数小。
这里有两个要点:
1). 需要先对数据进行排序;
2). 数据个数是奇数还是偶数,要分情况讨论,如图:
最后来分析众数,它的情况要复杂一些,众就是多的意思,从字面上就可以想到众数是出现次数最多的数字。
我们可以分两步来计算众数:
1). 统计每个数字出现的次数;
2). 找出出现次数最大的数字;
如下图所示,2出现了两次,其它数字都只出现了一次,所以众数为2:
如果一组数据中出现最多次数的数据有多个,则这几个数据都为众数,众数可以有两个或两个以上,如下图所示:
根据题目要求,选择最大的数字作为众数,也就是9。
为了更好地组织代码,可以定义3个函数分别来计算平均值、中位数和众数。
思路有了,接下来,我们就进入具体的编程实现环节。
三.编程实现
根据上面的思路分析,我们分4步来编写程序:
-
定义函数计算平均值
-
定义函数计算中位数
-
定义函数计算众数
-
完成主程序
1. 定义函数计算平均值
第一步比较简单,定义函数如下:
代码非常简单,直接使用Python自带的sum()函数即可,不要傻傻地循环累加了。
2. 定义函数计算中位数
根据前面的思路分析,我们定义函数如下:
代码不难,说明两点:
1). 在计算idx下标的时候,需要使用整除运算;
2). 列表的下标从0开始,当idx为偶数时,中间的两项下标分别为idx和idx - 1;
3. 定义函数计算众数
根据思路分析,自定义函数如下:
代码不多,强调三点:
1). 统计某一项在列表中出现的次数,直接调用count()函数即可;
2). 次数最多的数字可能会出现多个,因此这里使用列表来保存,返回的也是列表;
3). 在构造列表的时候,使用了列表推导式的编程技巧,这是一个筛选的过程,通过if语句将满足条件的列表项加入zs列表。
4. 完成主程序
有了前面的3个自定义函数,接下来就比较简单了,代码如下:
代码不多,说明4点:
1). 在获取用户输入的时候,使用了列表推导式,超级好用;
2). 计算中位数之前,需要对列表进行排序,平均数和众数是否排序都不影响;
3). 平均数和中位数的结果是小数,需要保留两位小数,这里使用了f字符串;
4). 众数可能有多个,我们只需要最大的一个,使用max()函数获取即可。
至此,整个程序就全部完成了,你也可以输入不同的数字串来测试效果。
四.总结与思考
本题代码在20行左右,涉及到的知识点包括:
-
循环语句,主要for...in循环;
-
输入处理,重点是多个数字的连续输入;
-
内置函数的使用;
-
列表的灵活运用,尤其是列表;
-
函数的定义及使用;
-
格式化输出;
本题难度中等,难点有两个,一是如何处理有多个众数的情况,二是如何保留两位小数。
针对第一点,我们可以这么来思考,先不管到底要哪一个,先用列表将它们保存起来,作为候选数字,然后再考虑如何从候选数字中选出最大,问题是不是一下子就变简单了。这其实还是计算思维中的分解思维,即将一个复杂问题拆分成多个简单问题。
对于小数精度的控制,通常有如下三种方式:
1). 格式化说明符
2). 格式化字符串
3). round()函数
具体的介绍,可以参考《计算分数和-第12届蓝桥杯选拔赛Python真题精选》这篇教程,一定要熟练掌握。
超平老师给你留一道思考题,你知道中位数和众数有什么作用吗,通常会用在哪些地方呢?
你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄
需要源码的,可以移步至“超平的编程课”gzh。