python deque索引超出范围_Python小练习:运动会各班报名人数统计

背景:学校准备举办一场运动会,每个班的学生都可以报名参加,现在有一张表,以文本形式存储,其中:A1表示班级代号,Cara为学生名字,girl为学生性别,12为学生年龄。

需求:按照班级,计算出每个班参加运动会的人数,并且按照参加人数的多少进行降序排列。

71780d5d2ca4cc09f5d95c7de4fb36aa.png

第一步:读入文件数据

ca78001a9d71c32066e6c49daafce860.png

运行结果:

['A1 Cara girl 12n', 'A2 Cindy girl 14n', 'A3 Henry boy 12n', 'A4 Helen girl 13n', 'B1 Bob boy 12n', 'B1 Back boy 13n', 'B3 Diary girl 12n', 'B3 Chen boy 14n', 'A2 Zig boy 11n', 'A3 Shary girl 13n', 'A1 Nick boy 15n', 'C1 Nacy girl 12n', 'C1 Golory girl 13n', 'C1 Hary girl 12n', 'C4 Hex boy 14n', 'C2 Jack boy 12n', 'B2 Keen boy 12n', 'B3 Linda girl 14n', 'B4 Yook boy 12n', 'B2 Goge boy 11n', 'C2 Sin girl 13n', 'n']

可以看到,读入后,每行记录后面出现了n,即换行符。并且,最后一行为一个换行符,也就是说,文本中最后一行是空白行。在进行后续处理时,需要注意这个问题~

第二步:创建一个字典,用于存放各个班参加运动会的学生名字。

98f3247053599b6f0bb789679df4c9f5.png

注释①:if not row.strip(): continue这句话必须写上!不然,就会报错……

你瞧:

57936062a1f6da34b17cc64dd73c8aff.png

说是列表的索引号超出范围了,即splitted_list[0],splitted_list[1]这里的索引不在范围内。

事实上,它们真的在范围内的啊……我试了很多次,不用For循环就不会报错,一用就错,呵呵哒~~~

后来,百度了很久,遇到一个大牛的回答,让添加上if not row.strip(): continue这句话,果然,有奇效!

深究一下,这句话是什么意思???

大神说,这句话可以跳过空白行。一般来说,txt格式的文件会有空白行,如文本最后一行。也就是说,for循环循环到最后一行时,发现是空白行,对空白行进行split形成splitted_list,此时,splitted_list是空列表,再使用索引进行取值,明显是没有值的呀~所以会报错说索引超出范围。

刨根问底的我,又想知道,为什么if not row.strip(): continue可以实现跳过空白行这个功能?

我用了一个小例子进行演示:

2f24e9e5d0aeb1f3064c5682c09f57f9.png

由上面的小例子可以看出,对空白行进行strip()后,就是空,而在Python中,空就是None,而None在if、while等条件判断语句中,None看作False,因此,if not None:等价于if True:,即是一个恒为真的判断,后面的语句一定会被执行。continue表示跳过该行数据。

不信?看个例子:

bbd1b4f43bf797492348e34880def6fc.png

可见,在判断语句中,None,False,空,是等价的。

抄某位大神的作业,总结的很好~

5ae95b64bc1e537b7a7bdeb4b05371ed.png

参考资料:

Python中对变量是否为None的判断 - 满月青灰 - 博客园​www.cnblogs.com

注释②:字典的键可以对应一个列表哦~

一直以来都习惯键对应一个值的情况,事实上,键对应一个列表也是可以是~比如:

565246a7cc04886723ce11d692ffbfcd.png
if class_name not in d:
    d[class_name] = [stu_name]
else:
    d[class_name] += [stu_name]

以第一条记录A1,Cara为例,上述代码表示,如果班级名A1不在字典d中,则在字典中创建班级名A1这个键,并且,将对应的学生名Cara转化为列表,将列表与键对应起来。当再次读到A1这个班级有关的记录时时,由于A1已经在d中,则向列表中添加学生名即可。

运行第二步代码后,字典d最终结果如下:

{'A1': ['Cara', 'Nick'], 'A2': ['Cindy', 'Zig'], 'A3': ['Henry', 'Shary'], 'A4': ['Helen'], 'B1': ['Bob', 'Back'], 'B3': ['Diary', 'Chen', 'Linda'], 'C1': ['Nacy', 'Golory', 'Hary'], 'C4': ['Hex'], 'C2': ['Jack', 'Sin'], 'B2': ['Keen', 'Goge'], 'B4': ['Yook']}

第三步:对每个班级的人数进行统计,并按照人数降序排列

0d0fe10a995d316024fcfcc2fa6bb88a.png

注释:①使用zip()函数进行数据组配后,生成的是zip对象,不能直接打印,需要将它转为list。

②sort()方法会在原列表基础上直接修改并覆盖原列表。zip后的结果为列表嵌套元组形式。对这个格式的数据进行排序,还是可以使用列表的sort方法。

[('A1', 2), ('A2', 2), ('A3', 2), ('A4', 1), ('B1', 2), ('B3', 3), ('C1', 3), ('C4', 1), ('C2', 2), ('B2', 2), ('B4', 1)]

key = lambda x : x[1],x代表列表中的一个个元组,x[1]表示元组的第2个元素,即人数。

reverse = True表示进行降序排列。

第三步运行结果如下:

[('B3', 3), ('C1', 3), ('A1', 2), ('A2', 2), ('A3', 2), ('B1', 2), ('C2', 2), ('B2', 2), ('A4', 1), ('C4', 1), ('B4', 1)]

哎呀妈呀,大功告成~虽然是小栗子一个,但是还是很有收获~~~

洗洗睡了……

参考资料:

用Python玩转数据_中国大学MOOC(慕课)​www.icourse163.org
1a5c1801cc50aca29c0cc7884e89b2c7.png
1、问题描述:参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(m<=20,n<=20) 2、功能要求: (1) 可以输入各个项目的前三名或前五名的成绩; (2) 能统计各学校总分, (3) 可以按学校编号或名称、学校总分、男女团体总分排序输出; (4) 可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。 (5) 数据存入文件并能随时查询 (6) 规定:输入数据形式和范围:可以输入学校的名称,运动项目的名称 3、输出形式:有中文提示,各学校分数为整形 4、界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。 5、存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构; 6、测试数据:要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值