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