题目
学校共设有多个学院,具体学院代码和名称存放在字典中。现学校举办一次全校性大型公益活动,需要统计各学院参与本科学生数,并列出参与人数排前3的学院与参与人数。学院代码与学院名称存放于字典中:输入参与学生的学号(12位,其中第5-8位为学院代码),统计各学院的参与人数,并输出人数最多的前3个学院名称及人数。
若学号对应的学院不在字典中,则均统计为“其他”,如果参与学院不足3个,则按实际学院数输出。请将以下字典直接复制到程序中。题目保证输入的学号均为12位数字。
dict1 = {
'0550': '机械工程学院',
'0556': '计算机学院',
'0557': '自动化与电子信息学院',
'0560': '化学学院',
'0565': '化工学院',
'0572': '材料科学与工程学院',
'0582': '环境与资源学院',
'0580': '土木工程与力学学院',
'0571': '物理与光电工程学院',
'0575': '数学与计算科学学院',
'0501': '马克思主义学院',
'0502': '哲学与历史文化学院',
'0519': '公共管理学院',
'0525': '法学部',
'0513': '商学院',
'0543': '艺术学院',
'0531': '外国语学院',
'0537': '文学与新闻学院',
'0585': '国际交流学院',
'0596': '兴湘学院'
}
示例
例如,输入:
202105430122 202105430113 202105430130 202105430118 202105000101 202105000102
则应输出:
艺术学院 4其他 2
解题思路
这题也不是很难,题目已经摆明了要你使用dict(当然你也可以不用dict),但是题目的细节要求很多:
1、在排序的时候对于相同的值按按输入学号的先后顺序输出
2、若学号对应的学院不在字典中,则均统计为“其他”
3、如果参与学院不足3个,则按实际学院数输出。
我们一个个来解决:
首先说个技巧性的东西
我们读入的数据是一个个学号,但是输出的是学号所对应的学院,因此在处理数据的时候,我们在存储数据的时候就可以直接存学院。
针对问题1
这个好说,即在排序的时候不排key就行了,简洁的lambda表达式排一下即可
sorted_count = sorted(count_dict.items(), key=lambda x: x[1], reverse=True)
针对问题2
这个就在处理读入的数据时候稍微改一下即可
进来的数据不是有不在dict1中的学院吗,那么我就写一个if判断即可
for item in input_list:
college_code = item[4:8]
if college_code in dict1:
college_name = dict1[college_code]
else:
college_name = "其他"
if college_name in count_dict:
count_dict[college_name] += 1
else:
count_dict[college_name] = 1
针对问题3
这个算不上什么太大的问题,我们只需要在输出的时候判断一下,dict数据库中有没有3个就行了,我们只需在range函数中判断一下即可
源码
dict1 = {
'0550': '机械工程学院',
'0556': '计算机学院',
'0557': '自动化与电子信息学院',
'0560': '化学学院',
'0565': '化工学院',
'0572': '材料科学与工程学院',
'0582': '环境与资源学院',
'0580': '土木工程与力学学院',
'0571': '物理与光电工程学院',
'0575': '数学与计算科学学院',
'0501': '马克思主义学院',
'0502': '哲学与历史文化学院',
'0519': '公共管理学院',
'0525': '法学部',
'0513': '商学院',
'0543': '艺术学院',
'0531': '外国语学院',
'0537': '文学与新闻学院',
'0585': '国际交流学院',
'0596': '兴湘学院'
}
input_str = input()
input_list = input_str.split()
count_dict = {}
for item in input_list:
college_code = item[4:8]
if college_code in dict1:
college_name = dict1[college_code]
else:
college_name = "其他"
if college_name in count_dict:
count_dict[college_name] += 1
else:
count_dict[college_name] = 1
sorted_count = sorted(count_dict.items(), key=lambda x: x[1], reverse=True)
for i in range(min(3, len(sorted_count))):
print(sorted_count[i][0], sorted_count[i][1])
ps:代码不是很长,有40行是因为dict1占了近20行,没办法,vscode给我排的版。。。。