7-40 jmu-python-班级人员信息统计 (15 分)

输入a,b班的名单,并进行如下统计。

输入格式:

第1行::a班名单,一串字符串,每个字符代表一个学生,无空格,可能有重复字符。
第2行::b班名单,一串字符串,每个学生名称以1个或多个空格分隔,可能有重复学生。
第3行::参加acm竞赛的学生,一串字符串,每个学生名称以1个或多个空格分隔。
第4行:参加英语竞赛的学生,一串字符串,每个学生名称以1个或多个空格分隔。
第5行:转学的人(只有1个人)。

输出格式

特别注意:输出人员名单的时候需调用sorted函数,如集合为x,则print(sorted(x))
输出两个班级的所有人员数量
输出两个班级中既没有参加ACM,也没有参加English的名单和数量
输出所有参加竞赛的人员的名单和数量
输出既参加了ACM,又参加了英语竞赛的所有人员及数量
输出参加了ACM,未参加英语竞赛的所有人员名单
输出参加英语竞赛,未参加ACM的所有人员名单
输出参加只参加ACM或只参加英语竞赛的人员名单
最后一行:一个同学要转学,首先需要判断该学生在哪个班级,然后更新该班级名单,并输出。如果没有在任何一班级,什么也不做。

输入样例:

abcdefghijab
1   2 3 4 5 6 7 8 9  10
1 2 3 a b c
1 5 10 a d e f
a
结尾无空行

输出样例:

Total: 20
Not in race: ['4', '6', '7', '8', '9', 'g', 'h', 'i', 'j'], num: 9
All racers: ['1', '10', '2', '3', '5', 'a', 'b', 'c', 'd', 'e', 'f'], num: 11
ACM + English: ['1', 'a'], num: 2
Only ACM: ['2', '3', 'b', 'c']
Only English: ['10', '5', 'd', 'e', 'f']
ACM Or English: ['10', '2', '3', '5', 'b', 'c', 'd', 'e', 'f']
['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
结尾无空行

我的回答:

# 处理多个空格间隔的函数:
def HandleBlock(list):
    new_list =[]
    for item in list:
        if item != "":
            new_list.append(item)
    return new_list

# 输入
grade_a_str = input()
grade_b_original_list = input().split(" ")
acm_original_list = input().split(" ")
english_original_list = input().split(" ")
trans_school = input()

# 列表化处理
grade_a_list = []
for item in grade_a_str:
    grade_a_list.append(item)
grade_b_list = HandleBlock(grade_b_original_list)
acm_list = HandleBlock(acm_original_list)
english_list = HandleBlock(english_original_list)

# 去重复处理:
'''
# 建立哈希表
check_table = {}
for item in grade_a_list + grade_b_list:
    check_table[item] = 0
# 通过哈希冲突来去重
final_a = []
final_b = []
for item in grade_a_list:
    if check_table[item] == 0:
        final_a.append(item)
        check_table[item] = 1
for item in grade_b_list:
    if check_table[item] == 0:
        final_b.append(item)
        check_table[item] = 1
'''
# 用集合法去重可能更简单:
final_a = list(set(grade_a_list))
final_b = list(set(grade_b_list))
# 输出的测试
'''
print(sorted(final_a))
print(sorted(final_b))
print(sorted(acm_list))
print(sorted(english_list))
print(sorted(trans_school))
'''
# 输出处理
print(f'Total: {len(final_a)+len(final_b)}')
Not_in_race = []
All_racers = []
ACMandEnglish = []
Only_ACM = []
Only_English = []
ACMorEnglish = [] #只参加了acm或者english中的一项
for item in final_a + final_b:
    if item in acm_list:
        All_racers.append(item)
        if item in english_list:
            ACMandEnglish.append(item)
        else:
            Only_ACM.append(item)
    elif item in english_list:
        All_racers.append(item)
        if item in acm_list:
            ACMandEnglish.append(item)
        else:
            Only_English.append(item)
    else:
        Not_in_race.append(item)
# 利用集合的补集运算
ACMorEnglish = list(set(Only_ACM)^set(Only_English))
print(f"Not in race: {sorted(Not_in_race)}, num: {len(Not_in_race)}")
print(f"All racers: {sorted(All_racers)}, num: {len(All_racers)}")
print(f"ACM + English: {sorted(ACMandEnglish)}, num: {len(ACMandEnglish)}")
print(f"Only ACM: {sorted(Only_ACM)}")
print(f"Only English: {sorted(Only_English)}")
print(f"ACM Or English: {sorted(ACMorEnglish)}")
if trans_school in final_a:
    print(sorted(list(set(trans_school) ^ set(final_a))))
elif trans_school in final_b:
    print(sorted(list(set(trans_school) ^ set(final_b))))
else:
    pass

能从这道题目里面学习到的知识点:

  1. 首先是关于以1个或多个空格分隔的处理,我们采用的是:
    • 依然先按照空格来进行元素的划分。
    • 去除列表中引多个空格分隔而产生的""字符。
  2. 本题当中学到的一个最重要的要点是
    • 以前面对重复元素问题的时候,我采取的通法都是用自建哈希表,通过哈希冲突的解决来解决重复元素的剥离问题。
    • 但是这次的解题中,我使用了Python中set的数据结构,天然地运用了集合本身互异性的特点通过把存在重复元素的列表先转化成集合,然后再将集合转回列表的方式,能够实现快速解决这种重复元素的剥离问题。
  3. 说明在处理不同集合之间的问题的相互关系的时候,要学会考虑去使用set这种数据结构,他们存在天然的优势,并且在集合间关系的讨论的问题中,我们还可以借用集合的运算很直接地处理一些分类问题。
  4. 最后要注意多了解python本身自带地函数,其中,sorted()函数列表的排序是很好用的功能。

Python的内置函数

Python的内置函数

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐