题目要求(成绩数据已给出)

输入学生成绩信息序列,完成对于每个学生成绩数据的储存,并将所有学生储存于列表中;在此基础上,按照总分从高到低的学生名单,总分从低到高的学生名单,三门课成绩从高到低的学生名单 相同成绩都按先录入排列在前的规则处理。

成绩原始数据如下:

SanZhang 70 80 61
SiLi 86 77 81
WuWang 88 90 77
MingLi 60 77 81
MiWang 71 70 60
HaiLi 88 78 89
HeWang 70 90 80
LiWang 67 71 70


  • 解题思路(啰嗦的很,可直接看代码)
  1. 首先进行数据的输入,要求用字典储存学生信息,并将学生放入列表。因此,思路为:建立一个储存数据的列表data_list,并将字典作为列表的元素,每一个字典对应一个学生的信息,然后通过循环结构将输入的数据分别作为对应键的值。
  2. 建立数据列表后,通过调用列表中的字典,取出学生成绩进行运算比较。建立data_sum,list_tmp等成绩列表储存各个学生总成绩和单科成绩,对这些列表进行排序,然后利用列表进行学生的排序:循环遍历成绩列表中每一个数值,然后再在字典中遍历查找相同值,提取该值对应的字典的Name成员,放入新建的列表sort_list中;;循环结束即得到排序的名单(即sort_list)。
  3. 注意到成绩可能出现重复情况,而相同成绩都按先录入排列在前的规则处理,因此想到两种处理方式(分别在sort_sum和sort_sin中体现):

(1)利用pandas去除重复项,然后在字典中遍历找到相符值,得到值对应的键

(2)不去除重复元素,在遍历寻找相符值时,找到一个即进入下一次循环(continue)。


代码如下:

import pandas as pd
from pandas import DataFrame  # 用于删除求和时重复项
'''
对待重复成绩,本程序提供两种处理方式(在sort_sum和sort_sin中体现):
1.利用pandas去除重复项,然后在字典中遍历找到相符值,得到值对应的键
2.不去除重复元素,在遍历寻找相符值时,找到一个即进入下一次循环(continue)
'''


# 定义初始化数据函数
def input_data():
    data_list = list()  # 用字典储存每个学生数据,并将字典放入列表data_list中
    for i in range(8):
        data_list.append(dict())                        # 在列表中创建空字典
        title = ["Name", "Math", "English", "Physics"]  # 创建键列表用于字典键值对建立
        str_tmp = input()                               # 输入得到字符串str_tmp
        l_tmp = str_tmp.split(" ")                      # 将输入由字符串转为列表l_tmp
        data_list[i][title[0]] = l_tmp[0]               # 将名字作为键Name对应值
        j = 1
        while j < 4:                                    # 将成绩分别对应键放入
            data_list[i][title[j]] = int(l_tmp[j])
            j += 1
    return data_list    # 返回储存信息的(字典)列表


# 定义总成绩排序函数
def sort_sum(data_list):
    sort_list = list()   # 初始化排序输出列表
    data_sum = list()
    for i in range(8):
        ind_sum = 0      # 初始化每个人成绩总和
        title = ["Math", "English", "Physics"]
        for j in range(3):
            ind_sum += data_list[i][title[j]]
        data_sum.append(ind_sum)   # 得到总成绩列表
    data_sum = pd.DataFrame(data_sum)
    data_sum.drop_duplicates(subset=None, keep='first', inplace=True)    # 去除重复的总成绩,以免在字典中重复检索
    data_sum = list(data_sum[0])
    data_sum.sort()                # 将总成绩升序排列
    for i in range(len(data_sum)):
        for j in range(8):
            if data_sum[i] == data_list[j]["Math"] + data_list[j]["English"] + data_list[j]["Physics"]:
                sort_list.append(data_list[j]["Name"])
    print("总成绩排名(升序)为:", sort_list)
    sort_list.reverse()
    print("总成绩排名(降序)为:", sort_list)


# 定义单项成绩排列函数
def sort_sin(data_list):
    sort_math = list()
    sort_eng = list()
    sort_phy = list()
    list_tmp = list()   # 用于暂时存放各个学生各科成绩
    for i in range(8):  # 排列高数成绩
        list_tmp.append(data_list[i]["Math"])
    list_tmp.sort(reverse=True)
    for i in range(8):
        for j in range(8):
            if data_list[j]["Math"] == list_tmp[i] and data_list[j]["Name"] not in sort_math:
                sort_math.append(data_list[j]["Name"])
                continue
    list_tmp.clear()
    for i in range(8):  # 排列英语成绩
        list_tmp.append(data_list[i]["English"])
    list_tmp.sort(reverse=True)
    for i in range(8):
        for j in range(8):
            if data_list[j]["English"] == list_tmp[i] and data_list[j]["Name"] not in sort_eng:
                sort_eng.append(data_list[j]["Name"])
                continue
    list_tmp.clear()
    for i in range(8):  # 排列大物成绩
        list_tmp.append(data_list[i]["Physics"])
    list_tmp.sort(reverse=True)
    for i in range(8):
        for j in range(8):
            if data_list[j]["Physics"] == list_tmp[i] and data_list[j]["Name"]not in sort_phy:
                sort_phy.append(data_list[j]["Name"])
                continue
    print("高数成绩排名(降序)为: ", sort_math)
    print("英语成绩排名(降序)为: ", sort_eng)
    print("大物成绩排名(降序)为: ", sort_phy)


# 主函数调用
l = input_data()
print("----------第**次考试学生成绩情况明细----------")
print("学生名单:")
for i in range(8):
    print("(", i+1, ")", l[i]["Name"], sep='', end=' ')
print("\n详细成绩如下:")
for i in range(8):
    print(l[i])
print("成绩排名如下:")
sort_sum(l)
sort_sin(l)

注意注意注意!!!

运行时,如果输入数据格式不严格按照“数据(空格)数据(空格)…\n”,则程序无法正常运行。

原因:如果输入格式不对,则会导致“ ”或“”被列入字典的值,导致无法比较或out of index等问题。

所以,一定严格按照格式输入调试(就用题目所给数据,直接复制粘贴)

运行结果:

Python学生成绩排序 python顺序表学生成绩录入_成绩排名