学生成绩排序

学生成绩排序

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

相关推荐

北京面馆,哪一碗最能抚慰打工人的心?
直播主持人招聘信息页介绍
浪潮大数据平台怎么样

浪潮大数据平台怎么样

12-19 👁️ 5328
负责部门一览:Carbon Fiber Div.
Windows 局部截屏怎么操作 一步步教你用快捷键和截图工具轻松搞定截图难题
我国牛肉为何这样贵?主要是这几个原因!
《王者荣耀》如何更改地区:2025年完整分步指南
深度评测:美的KFR-51LWDN8Y-PA400(D3)怎么样呢?好不好用?网友吐槽质量如何?
原神手游设置在哪 手机端调画质教学