【问题描述】
有学生选修课报名列表,值为[('王浩','手工'),('李斌','摄影'),('张一山','手工'),('唐红','手工'),('陈朋','广告设计'),('赵明','摄影')],请编写一个程序统计各选修课的学生名单。
输出结果:
选修了"手工"的同学有:王浩,张一山,唐红
选修了"摄影"的同学有:李斌,赵明
选修了"广告设计"的同学有:陈朋
【题前思考】
根据问题描述,填写表4-2-3。
表4-2-3 问题分析
【解题思路】
我们要统计的对象是课程,因此使用课程名称作为字典的键,而选修了本课程的学生名单作为该键的值。当课程名称在字典中时,将学生姓名追加到该课程对应的学生名单中;如果课程名称没有在字典中,则为该课程创建项,以这个学生构成的列表作为其值。
【程序代码】
【代码分析】
①:定义一个空的字典用于保存选修各课程的学生名单。
②:for s in a:对列表a中的每个值执行循环体中的操作。if s[1]in res:res[s[1]].append(s[0])判断s[1]中的值(课程名称)是否在字典res中,如果在字典中,就将姓名s[0]追加到课程名s[1]对应的学生名单中。res[s[1]]表示选修了课程s[1]的学生名单,即学生姓名构成的列表。
③:如果课程没有在res中,则在字典res中为课程s[1]新建一个项,同时给出选修这门课的初始学生名单,此时显然只有一个学生s[0]选修了这门课,学生名单就表示为[s[0]]。
④:print(f'选修了"{s}"的同学有:{",".join(res[s])}')表示格式化输出数据,res[s]是选修了课程s的学生名单,",".join(res[s])表示用“,”将学生名单中的姓名连接成一个字符串。