|
5鱼币
本题 包含文件附件,请有空的高手帮助以下,这题因为真的卡了三天,实在走投无路,自己也解读了答案中99%的代码,只剩下一条无法理解
要求根据id.txt和finalscore.txt生成学生成绩。文件都是utf-8格式的
1) id.txt 里面放着学号和姓名,没有排序。姓名很怪,不要在乎
2) finalscore.txt里面放着学生的做题信息。其中第三栏或第四栏是做题数量
有的学生昵称是学号,有的是姓名,有的是姓名学号都有。只要有学号或姓名,就有效
3) 分数计算办法: 1题50,2题60,此后每做一题加4分
4) 生成id.txt里面有的所有学生的成绩,按学号排序输出到指定的结果文件。
如果在 finalscore里面找不到学生的做题记录,该生题数和成绩都记0
结果文件格式如:
学号 姓名 题数 分数
1700943357 玘尜寋 0 0
1700943359 杛旺煃 0 0
1700943383 玘签翢 2 60
1700943405 陕榄伳 0 0
1700943465 匒乡奡 5 72
1700943469 巸俗杽 3 64
1700943472 钬内佦 0 0
1700943481 別珜辽 0 0
1700943523 趂盨淦 7 80
这样的结果可以导入excel表格(拷贝粘贴即可)
id.txt里面没有的学生,不用处理。
注意:源文件和目标文件里面的分隔符,都不是空格,都是制表符 \t (Tab)
注意看finalscore.txt里面,有连着两个 Tab 的情况,比如下面学号和做题数之间是2个tab:
4 1700943836 9
也许你需要关注这一点,也许并不需要
5)程序文件名必须叫count.py。运行时,将count.py和id.txt, finalscore.txt放在相同文件夹下面,
然后在命令行窗口进入该文件夹,以命令行方式运行程序,命令行中可以指定结果文件名:
python count.py XXX.txt
程序在同一个文件夹下生成结果文件XXX.txt。这个文件名可以随便指定
6)正确的结果已经给出,即ans.txt。最终生成的结果应该和ans.txt文件一致
以下是网上搜索到的答案
import re
import sys
def chazhao(x,y):
l=len(y)
for i in range(l):
if x in y[i]:
return i
return -1
def grade(a):
if a==1:
x=50
elif a==2:
x=60
elif a>2:
x=60+(a-2)*4
else:
x=0
return x
f=open('id.txt','r',encoding='utf-8')
students=f.readlines()
f.close()
students.sort()
f=open('finalscore.txt','r',encoding='utf-8')
score=f.readlines()
f.close()
f=open(sys.argv[1],'w',encoding='utf-8')
f.write("学号\t姓名\t题数\t分数\n")
for x in students:
l=x.split()
x1,x2=l[0],l[1]
if chazhao(x1,score)!=-1 or chazhao(x2,score)!=-1:
i=chazhao(x1,score)
if i==-1:
i=chazhao(x2,score)
l1=re.split('\t',score[i])
a=int(l1[3])
agrade=grade(a)
f.write("%s\t%s\t%d\t%d\n"%(x1,x2,a,agrade))
else:
f.write("%s\t%s\t%d\t%d\n"%(x1,x2,0,0))
f.close()
答案中第40行代码我无法理解 l1=re.split('\t',score[i])
这行代码的i,我无法理解,因为上面 chazhao(x,y)中必然是产生1或者-1,他不是一个循环
而l1=re.split('\t',score[i]) 中我理解是这个i需要一个循环才能每次轮换内容,如果一直都是1那永远都是第一行
而这题我对题目的理解解决思路是这样的,希望有错能更正一下
目标按照文件ID里面的数据作为索引,在文件finalscore寻找数据补充回ID文件
因为finalscore文件内容有错乱内容,我一开始打算先整理好finalscore文件内容再提取,这样感觉简单,但最后连整理也花了半天也没整理出来
然后最后按照上面代码思路,以ID文件作为索引,校验finalscore内容,存在则提取不存在则跳过,然后就卡在了我上面的那个代码那里,因为我写不出,就去搜答案,发现这个答案跟我的思路基本一样,但我看不懂40行这段
还有其他解题思路可以提供下吗?
def chazhao(x,y):
l=len(y)
for i in range(l):
if x in y[i]:
return i
return -1
找到了返回的是 字母i 不是数字1,你看错了
i=chazhao(x1,score)
if i==-1:
i=chazhao(x2,score)
这几行代码的意思是,id.txt里的学生若找到了
如果是找到学号了,那么chazhao(x1,score)肯定是返回第几行。但是如果chazhao(x1,score)返回-1则说明不是按照学号找到的,那么就是按照名字找到的,这时候
i=chazhao(x2,score) 这句代码就是按照名字找,看看在第几行,并赋值给 i
然后下边那句话l1=re.split('\t',score) 是把找到的这一行,按照‘\t’切割,切割出来几项。其中第三项或者第四项就是这个人的答题数
下边这句话a=int(l1[3])是个bug,因为分数不一定在第四项,(其中第三栏或第四栏是做题数量)这句话有可能报错。
我的想法是 try:
a=int(l1[2])
except:
a=int(l1[3])
但是我并没有跑一遍代码,不知道改的对不对,如果改的对了你也理解了麻烦给我最佳
如果还有哪里没看懂也欢迎继续问
|
最佳答案
查看完整内容
找到了返回的是 字母i 不是数字1,你看错了
i=chazhao(x1,score)
if i==-1:
i=chazhao(x2,score)
这几行代码的意思是,id.txt里的学生若找到了
如果是找到学号了,那么chazhao(x1,score)肯定是返回第几行。但是如果chazhao(x1,score)返回-1则说明不是按照学号找到的,那么就是按照名字找到的,这时候
i=chazhao(x2,score) 这句代码就是按照名字找,看看在第几行,并赋值给 i
然后下边那 ...
|