2021年全国大学生数学建模竞赛C题优秀论文C085--附录3代码优化,以及附录3对应的论文段落指路

C085原文链接(dxs.moe.gov.cn 教育部中国大学生在线)

论文的附录3-weekcmp.py

代码优化思路如下:

1、添加变量的类型注解
2、将不必要的循环结构,转化为函数或列表解析式/列表推导式
3、添加了一些注释,以便于理解代码

修改后的代码如下:

# 附录3-weekcmp.py
# 介绍:比较每周期内同一周供货情况,输入:附件1"近5年402家供应商的相关数据.xls";获得"期望供货量.xlsx"
# python解释器版本:3.10
import xlrd  # 版本:2.0.1
import xlsxwriter  # 版本:3.1.2
import numpy as np  # 版本:1.25.0

excel = xlrd.open_workbook('附件1 近5年402家供应商的相关数据.xls', 'tb')
sheet = excel.sheet_by_name('供应商的供货量(m³)')
ID: list[402: str] = sheet.col_values(0)[1:]  # 获取第一列的内容-供应商ID,并删除第一个元素
FL: list[402: str] = sheet.col_values(1)[1:]  # 获取第二列的内容-材料分类,并删除第一个元素
# 获取W001列至W240列,S001行至S402行中的所有数据,组成一个二维列表
GH: list[402: list[240: float]] = [sheet.row_values(r)[2:] for r in range(1, sheet.nrows)]
sheet = excel.sheet_by_name('企业的订货量(m³)')
DH: list[402: list[240: float]] = [sheet.row_values(r)[2:] for r in range(1, sheet.nrows)]

GH_T: list[402: list[24: float]] = []
for r in range(sheet.nrows-1):  # 402个循环
    val: list[24: float] = []
    for j in range(24):
        CMP1: list[10: float] = [DH[r][i * 24+j] for i in range(10)]
        CMP2: list[10: float] = [GH[r][i * 24+j] for i in range(10)]
        AVE: np.array = np.mean(CMP2)
        GH_max: float = 0
        for i in range(10):
            if CMP1[i]==0:
                continue
            if CMP2[i] / CMP1[i]>0.9 and AVE * 3>=CMP2[i]>GH_max:  # 此处的分支语句规则,详见论文第13页第8~10行的两个规则
                GH_max = CMP2[i]
        val.append(GH_max)  # 这一行添加的是一个数值
    GH_T.append(val)  # 这一行添加的是一个包含了24个数值的列表
# 所以GH_T最后构造成为了一个402行,24列的二维列表

workbook = xlsxwriter.Workbook('期望供货量.xlsx')  # 建立文件
worksheet = workbook.add_worksheet()
for r in range(sheet.nrows-1):
    worksheet.write_row(r, 0, [ID[r], FL[r]])
    worksheet.write_row(r, 2, GH_T[r])
workbook.close()

附录3对应的论文内容指路

 如图所示,这是C085论文第13页第4至12行,实现这段内容的代码即为该论文的附录3-weekcmp.py。

参考链接

Python 3 新特性:类型注解

python读取excel报错Excel xlsx file

python读取excel某一sheet一列

Excel操作模块XlsxWriter之写入行worksheet.write_row()

Python|为什么列表推导式会更快

如有侵权,请联系我删除。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值