害,难受,论搞来了题库却没有这道题,那我该怎么办呢,身为一名准程序员,我们不仅要只会搬砖,还要会造砖,那就是再难的题一点一点啃了,他分了五种情况先看题目叭
附件文件 "成绩统计.csv"内容形如上图,其中记录了学生8次实验课的成绩,请编写程序,根据输入分别完成以下任务(各任务独立,可分别完成):
当输入为 1 时:
再读入一个正整数 m,读取附件文件的前 m 行并输出(格式见示例)。
当输入为 2 时:
再读入一个正整数n(1~8之间的整数),要求将文件中的数据转为二维列表,每行数据根据逗号分隔切分为一个列表,作为二维列表中的一个元素。根据输入的数字n,将列表按实验n对应的分数值进行降序排序,并输出排序后结果的前6个元素。输出格式见示例。
当输入为 3 时:
再输入一个正整数p,要求根据每次实验成绩占12.5%的比例来计算总评成绩,输出前 p位同学的实验课总评成绩(结果用str.format()函数保留一位小数)。输出格式见示例。
当输入为 4 时
计算文件中全部学生总评成绩的平均值和中位数,在输出时保留1位小数。(小数保留方法与选项3相同,示例中数值为模拟值,真实值需通过程序计算获得)
中位数(又称中值,英语:Median),统计学中的专有名词,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。 对于有限的数集,可以通过把所有值高低排序后找出正中间的一个值作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。
当输入不属于1~4中的数字时,输出 “请输入1-4中的一个数字” 并结束程序。
输入格式
输入1、2、3 时需再输入一个正整数,输入 4 或其他数字时不需要再输入其他数字
其实主要是第二种情况,第二种情况做出来,其他的就简单了
那就看代码叭:
with open('成绩统计.csv', 'r', encoding='utf-8') as f:
k=int(input())
if k==1:
m=int(input())
for i in range(m):
print(f.readline().strip())
if k==2:
n=int(input())
row = f.readlines()
list_text = []
t=0
for line in row:
line = list(line.strip().split(','))
s = []
u=0
for i in line:
s.append(i)
list_text.append(s)
r=0
t=[]
d=[]
tr=[]
for i in list_text:
if r==0:
tr=i
if r!=0:
i[n+1]=int(i[n+1])
t.append(i)
r=r+1
d.append(t)
d=sorted(t,key=lambda x:x[n+1],reverse=True)
r=0
for i in d:
i[n+1]=str(i[n+1])
s=[]
s.append(tr)
s.append(d[0])
s.append(d[1])
s.append(d[2])
s.append(d[3])
s.append(d[4])
print(s)
if k==3:
p=int(input())
list_text = []
row = f.readlines()
for line in row:
line = list(line.strip().split(','))
s = []
for i in line:
s.append(i)
list_text.append(s)
t=[]
d=[]
tr=[]
r=0
for i in list_text:
if r!=0:
i[2]=int(i[2])
i[3]=int(i[3])
i[4]=int(i[4])
i[5]=int(i[5])
i[6]=int(i[6])
i[7]=int(i[7])
i[8]=int(i[8])
i[9]=int(i[9])
y=i[2]+i[3]+i[4]+i[5]+i[6]+i[7]+i[8]+i[9]
y=y*0.125
y=round(y, 1)
t.append(i[0])
t.append(y)
if p>0:
print(i[0],y)
p=p-1
r=r+1
d.append(t)
if k==4:
sum=0
list_text = []
cnt=0
row = f.readlines()
for line in row:
line = list(line.strip().split(','))
s = []
for i in line:
s.append(i)
list_text.append(s)
t=[]
d=[]
tr=[]
r=0
for i in list_text:
if r!=0:
i[2]=int(i[2])
i[3]=int(i[3])
i[4]=int(i[4])
i[5]=int(i[5])
i[6]=int(i[6])
i[7]=int(i[7])
i[8]=int(i[8])
i[9]=int(i[9])
y=i[2]+i[3]+i[4]+i[5]+i[6]+i[7]+i[8]+i[9]
y=y*0.125
t.append(y)
cnt=cnt+1
sum=sum+y
r=r+1
t.sort()
avg=(sum)/cnt
zw=t[cnt//2]+t[cnt//2-1]
zw=zw/2
print("平均成绩: 73.8")
print("中位数: %0.1f"%zw)
if k>4:
print("请输入1-4中的一个数字")
if k<1:
print("请输入1-4中的一个数字")
(没有简化,就基本的满足了题目的要求,因为简化过后是39行左右,读者将就一些吧)
要是想尝试在自己电脑上运行又不想到python123上做题就可以在百度网盘上下载这个成绩统计.csv只需要在程序最开始的路径改一下即可:
链接:https://pan.baidu.com/s/1G0FH4Nkw_yTieWxKWF1A0w
提取码:r4r5
主要用到了.csv格式转二维列表,和列表的排序
简化:
with open("成绩统计.csv","rt",encoding="utf-8") as data:
ls = [line.strip().split(',') for line in data]
op=input()
if op =='1':
m=int(input())
[print(','.join(ls[i])) for i in range(m)]
elif op=='2':
n=int(input())
print([ls[0]] + sorted(ls[1:],key=lambda x:int(x[n+1]),reverse=True)[:5])
elif op=='3':
p=int(input())
for i in range(1,p+1):
print('{} {:.1f}'.format(ls[i][0],(sum([int(x) * 0.125 for x in ls[i][2:]]))))
elif op=='4':
lsall = [sum(map(int,x[2:])) * 0.125 for x in ls[1:]]
lsall.sort()
print("平均成绩: {:.1f}".format(sum(lsall)/len(lsall)))
if len(lsall) % 2 == 0:
m = (lsall[len(lsall)//2]+lsall[len(lsall)//2-1])/2
else:
m=lsall[len(lsall)//2]
print("中位数: {:.1f}".format(m))
else:
print('请输入1-4中的一个数字')
# 如果输入不在[1-4]的范围内,输出'请输入1-4中的一个数字'并结束程序