学生成绩排序

2024-02-26 17:37:33 浏览数 (1)

1 问题

本文要解决的问题是如何用python对学生的成绩进行排序.

2 方法

(1)、首先进行数据的输入,要求用字典储存学生信息,并将学生放入列表。因此,思路为:建立一个储存数据的列表data_list,并将字典作为列表的元素,每一个字典对应一个学生的信息,然后通过循环结构将输入的数据分别作为对应键的值。

(2)、建立数据列表后,通过调用列表中的字典,取出学生成绩进行运算比较。建立data_sum,list_tmp等成绩列表储存各个学生总成绩和单科成绩,对这些列表进行排序,然后利用列表进行学生的排序:循环遍历成绩列表中每一个数值,然后再在字典中遍历查找相同值,提取该值对应的字典的Name成员,放入新建的列表sort_list中;;循环结束即得到排序的名单(即sort_list)。

(3)、注意到成绩可能出现重复情况,而相同成绩都按先录入排列在前的规则处理,因此想到两种处理方式(分别在sort_sum和sort_sin中体现):

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

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

通过实验、实践等证明提出的方法是有效的,是能够解决开头提出的问题。

代码清单 1

代码语言:text复制
import pandas as pd
from pandas import DataFrame  # 用于删除求和时重复项
# 定义初始化数据函数
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)

3 结语

针对学生成绩排序问题,使用函数,循环,建立data_sum,list_tmp等成绩列表储存各个学生总成绩和单科成绩方法,通过实验,证明该方法是有效的。本实验在生活中也有用,但不够完善,未来任需努力的学习知识去完善和优化。

0 人点赞