前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >学生成绩排序

学生成绩排序

作者头像
算法与编程之美
发布2024-02-26 17:37:33
950
发布2024-02-26 17:37:33
举报

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等成绩列表储存各个学生总成绩和单科成绩方法,通过实验,证明该方法是有效的。本实验在生活中也有用,但不够完善,未来任需努力的学习知识去完善和优化。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-02-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法与编程之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档