import xlrd def result_write(result,i,j):#result为txt文件,i为比赛项目,j为奖项等级 tmp_str='' tmp_num=0 if award_dict[i][j][0]!=0: result.write(j+'获奖人数为'+str(award_dict[i][j][0])+'人,姓名如下:\n') else: result.write(j+'获奖人数为0人\n') for j in award_dict[i][j][1:]: tmp_str+=j tmp_str+=' ' tmp_num+=1 if tmp_num==10:#每十人写入文件并换行 result.write(tmp_str+'\n') tmp_str='' tmp_num=0 if tmp_num!=0:#向文件写入不满十人的姓名组 result.write(tmp_str+'\n') result.write('\n') award_dict=dict() data= xlrd.open_workbook("C:\\Users\\游雏\\Downloads\\2022蓝桥江西省赛.xls") sheet1 = data.sheet_by_name("Sheet1") col = sheet1.col_values(4) award_class=[] for i in col[1:]:#获取比赛项目列表,首字母统一大写 if 'a'<=i[0]<='z': i=i[0].upper()+i[1:] if i not in award_class: award_class.append(i) for i in award_class:#创建一个嵌套字典,一级字典以比赛项目为键,二级字典以奖项等级为键,值为获奖人姓名列表 award_dict[i]=dict(一等奖=[0],二等奖=[0],三等奖=[0]) for i in range(sheet1.nrows):#按行遍历表格 if i==0:continue row = sheet1.row_values(i) if row[2]=='江西理工大学':#row[2]为学校名 if 'a'<=row[4][0]<='z':#row[4]为比赛项目 row[4]=row[4][0].upper()+row[4][1:] award_dict[row[4]][row[5]][0]+=1#统计某项目某奖项的获奖人数,row[5]为奖项等级 award_dict[row[4]][row[5]].append(row[3])#将获奖者姓名添入一级键为项目二级键为奖项的列表,row[3]为获奖者姓名 award_level=['一等奖','二等奖','三等奖'] result=open("resutl.txt", "w") for i in award_class: result.write(i+'\n') for j in award_level: result_write(result,i,j) result.write('\n') result.close()帮我优化此代码
时间: 2024-02-04 13:03:40 浏览: 27
以下是代码优化建议:
1. 将常量定义为变量。将 award_level 的值定义为变量,这样有利于代码维护和修改。
2. 将重复代码提取为函数。可以将统计获奖人数和将获奖者姓名添入列表的代码提取为一个函数,使得代码更加简洁和易读。
3. 使用 with 语句来处理文件对象。这样可以避免手动关闭文件对象的问题。
4. 使用 f-string 格式化字符串。这样可以使得代码更加简洁和易读。
综上所述,以下是优化后的代码:
```python
import xlrd
def count_award(award_dict, project, level, name):
"""统计某项目某奖项的获奖人数和姓名列表"""
award_dict[project][level][0] += 1
award_dict[project][level].append(name)
def write_result(result, project, level, award_dict):
"""将某项目某奖项的获奖人数和姓名列表写入文件"""
num = award_dict[project][level][0]
if num != 0:
result.write(f"{level}获奖人数为{num}人,姓名如下:\n")
else:
result.write(f"{level}获奖人数为0人\n")
names = award_dict[project][level][1:]
for i in range(0, num, 10):
result.write(" ".join(names[i:i+10]) + "\n")
if num % 10 != 0:
result.write(" ".join(names[num//10*10:]) + "\n")
result.write("\n")
def optimize_code():
award_dict = {}
data = xlrd.open_workbook("C:\\Users\\游雏\\Downloads\\2022蓝桥江西省赛.xls")
sheet1 = data.sheet_by_name("Sheet1")
col = sheet1.col_values(4)
award_class = []
for i in col[1:]:
if 'a' <= i[0] <= 'z':
i = i[0].upper() + i[1:]
if i not in award_class:
award_class.append(i)
for i in award_class:
award_dict[i] = {"一等奖": [0], "二等奖": [0], "三等奖": [0]}
for i in range(sheet1.nrows):
if i == 0:
continue
row = sheet1.row_values(i)
if row[2] == '江西理工大学':
if 'a' <= row[4][0] <= 'z':
row[4] = row[4][0].upper() + row[4][1:]
count_award(award_dict, row[4], row[5], row[3])
award_level = ['一等奖', '二等奖', '三等奖']
with open("result.txt", "w") as result:
for i in award_class:
result.write(f"{i}\n")
for j in award_level:
write_result(result, i, j, award_dict)
```
最后需要注意的是,如果要在输出的字符串中包含花括号 {},需要使用两个花括号来进行转义,例如:"{{}}".