鱼C论坛

 找回密码
 立即注册
查看: 2758|回复: 7

[已解决]Python问题求助

[复制链接]
发表于 2020-12-4 20:14:18 | 显示全部楼层 |阅读模式
30鱼币
利用Python建立一个excel文件,该文件包含(学生姓名,语文成绩,数学成绩,英语成绩):
1)统计每个学生的平均分及排名,添加到最后的列
2)统计所有学生各科平均分,添加到最后行


代码我写了一半,但是排名和每课的平均分不会算,求大佬帮助
最佳答案
2020-12-4 20:14:19
import xlwt

data = [
    ["小花",99,100,98.5],#1
    ["小王",90,30.5,95],#
    ["小明",67.5,49.6,88],
    ["大佬",38,93,66],
    ["花花",60,49,88],
    ["天天",67,46,80],
    ["阿明",75,96,68],
    ["阿炳",44,55,77],
    ["阿冰",66,88,77],
    ["大梦",100,100,100]#
]

def build_data(source):
    for item in source:
        sum_score = sum(item[1:])#算总分
        avg_score = round(sum_score / 3,1) #算平均分,round取两位小数
    
        item.append(avg_score)

    return source

def build_sort(target):
    target_list = list()
    for item in target:        
        target_list.append(item)

    target_list.sort(key = lambda x: x[-1], reverse=True)
    result = dict()
    for row, item in enumerate(target_list, 1):
        result[item[0]] = row

    return result

def append_sort(data):
    source = build_data(data)
    dict_sort = build_sort(source)

    for item in source:
        item.append(dict_sort[item[0]])

    return source

def last_row(source):
    result = ['平均分', 0, 0, 0, 0, '']
    row = 0
    for item in source:
        row += 1
        row_list = item[1 : -1]
        for col, col_item in enumerate(row_list, 1):
            result[col] += col_item

    for col, item in enumerate(result[1 : -1], 1):
        item = round(item / row, 1)
        result[col] = item
    
    return result
    
def build_excel(data):
    result = append_sort(data)
    last_line = last_row(result)
    result.append(last_line)

    book = xlwt.Workbook()
    sheet = book.add_sheet("学生成绩")
    title = ['姓名','语文成绩','数学成绩','英语成绩','平均分','排名']

    for col, item in enumerate(title):
        sheet.write(0, col, item)

    for row, line in enumerate(result, 1):     
        for col, value in enumerate(line):
            sheet.write(row, col, value)
 
    book.save("students.xls")  

if __name__ == '__main__':
    build_excel(data)

练习.rar

670 Bytes, 下载次数: 7

我写的部分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-4 20:14:19 | 显示全部楼层    本楼为最佳答案   
import xlwt

data = [
    ["小花",99,100,98.5],#1
    ["小王",90,30.5,95],#
    ["小明",67.5,49.6,88],
    ["大佬",38,93,66],
    ["花花",60,49,88],
    ["天天",67,46,80],
    ["阿明",75,96,68],
    ["阿炳",44,55,77],
    ["阿冰",66,88,77],
    ["大梦",100,100,100]#
]

def build_data(source):
    for item in source:
        sum_score = sum(item[1:])#算总分
        avg_score = round(sum_score / 3,1) #算平均分,round取两位小数
    
        item.append(avg_score)

    return source

def build_sort(target):
    target_list = list()
    for item in target:        
        target_list.append(item)

    target_list.sort(key = lambda x: x[-1], reverse=True)
    result = dict()
    for row, item in enumerate(target_list, 1):
        result[item[0]] = row

    return result

def append_sort(data):
    source = build_data(data)
    dict_sort = build_sort(source)

    for item in source:
        item.append(dict_sort[item[0]])

    return source

def last_row(source):
    result = ['平均分', 0, 0, 0, 0, '']
    row = 0
    for item in source:
        row += 1
        row_list = item[1 : -1]
        for col, col_item in enumerate(row_list, 1):
            result[col] += col_item

    for col, item in enumerate(result[1 : -1], 1):
        item = round(item / row, 1)
        result[col] = item
    
    return result
    
def build_excel(data):
    result = append_sort(data)
    last_line = last_row(result)
    result.append(last_line)

    book = xlwt.Workbook()
    sheet = book.add_sheet("学生成绩")
    title = ['姓名','语文成绩','数学成绩','英语成绩','平均分','排名']

    for col, item in enumerate(title):
        sheet.write(0, col, item)

    for row, line in enumerate(result, 1):     
        for col, value in enumerate(line):
            sheet.write(row, col, value)
 
    book.save("students.xls")  

if __name__ == '__main__':
    build_excel(data)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-4 20:23:56 | 显示全部楼层
思路
1、每个学生的平均分及排名
1)计算每个学生的平均分,放入列表list1
2)list2=list1[:]  # 拷贝列表
3)list2.sort() # 排序
4)
for index,i in enumerate(list2):
     for j in list1:
         if i == j:
            index就是排名了

2、统计所有学生各科平均分
每个学生的单科成绩相加除以学生总数不就是了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-4 21:37:14 | 显示全部楼层
你这种需求,用pandas很容易实现。。。。。。。干嘛要用xlwt
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-5 05:31:06 | 显示全部楼层
先全部在内存里操作
用字典或者元组对象代替数据行 整个表的数据是一个对象列表
全部计算完毕再整体(逐行)写入文件


比如  data = [('姓名','学号'),('张三','112'),('李四','132')]
计算平均分之后 data为 [('姓名','学号'),('张三','112'),('李四','132'),('平均分','122')]
for data : writerow()   然后再该标红的标红啥的

不要先写入电子表格文件了再操作表格 毕竟你没用pandas
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-5 12:51:31 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-5 13:27:33 | 显示全部楼层

对了,我想问一下,这句target_list.sort(key = lambda x: x[-1], reverse=True)是干什么的,里面的key这些没看懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-5 14:16:32 | 显示全部楼层
段段努力秃头 发表于 2020-12-5 13:27
对了,我想问一下,这句target_list.sort(key = lambda x: x[-1], reverse=True)是干什么的,里面的key这 ...

按照 list 的最后一列进行(平均分)排序, x[-1]表示最后一项
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-17 03:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表