Python等级考试有道关于血压的综合题,某次模拟考试遇到过,有一定难度,当时没做出来,现在得空,就总结分析一下。
题目如下:
老王的女儿给老王测血压,记录了一段时间的血压测量值,在文件 xueyajilu.txt 中,每行是一条记录,包含:测量时间,左臂高压,左臂低压,右臂高压,右臂低压,心率;每个字段用英文逗号隔开,示例如下:
2018/7/2 6:00,140,82,136,90,69
2018/7/2 15:28,154,88,155,85,63
2018/7/3 6:30,131,82,139,74,61
2018/7/3 16:49,145,84,139,85,73
2018/7/4 5:03,152,87,131,85,63
(1)使用字典和列表类型进行数据分析,获取老王的
左臂和右臂的血压平均值
左臂和右臂的高压最高值、低压最高值
左臂和右臂的高/低压差平均值
心率的平均值
给出左臂和右臂血压情况的对比表,输出到屏幕上,请注意每行三列对齐。输出的整数向下取整。示例如下:
(2)上述显示的五个项目,如果左臂有 50%的测量值高于右臂的测量值,则输出“结论:左臂血压偏高”;如果等于 50% 的测量值高于右臂的测量值,则输出“结论:左臂血压与右臂血压相当”;如果小于 50% 的测量值高于右臂的测量值,则输出“结论:右臂血压偏高”。示例如下:
结论:左臂血压偏高, 心率的平均值为66
注意:本题目支持在线评测,请利用本地IDLE完善代码,编程调试至正确代码,并将编好的程序提交系统,得到评测结果。
#在…处填写多行代码
#在_____出填写一行代码
#可以修改其他代码
fi = open("xueyajilu.txt",'r')
jl = [[],[],[],[],[],[]] # 1:zb_h, zb_l,yb_h,yb_l
zyc = []
yyc = []
xl = []
for l in fi:
__________________
...
zyc.append(eval(lls[1])- eval(lls[2]))
yyc.append(eval(lls[3])- eval(lls[4]))
xl.append(eval(lls[5]))
fi.close()
cnt = _________
res = []
res.append(list(("高压最大值", ___________)))
res.append(list(("低压最大值", ___________)))
res.append(list(("压差平均值", ___________)))
res.append(list(("高压平均值", ___________)))
res.append(list(("低压平均值", ___________)))
res.append(list(("心率平均值", ____________)))
zbg = 0
ybg = 0
print('{:<10}{:<10}{:<10}'.format("对比项", "左臂", "右臂"))
for r in range(len(res)-1):
_____________________
...
if zbg > ybg:
print(______________________)
elif zbg == ybg:
print(______________________)
else:
print('______________________)
print(', 心率的平均值为{}'.format(res[5][1]))
题目分析:
本题主要考查对二维数据的综合处理能力,即如何对二维数据提取,加工,并输出。
题目提供的程序框架在一定程度降低了编码难度,但同时也限制了开发的自由度。另外,由于它缺少必要的注释,给解题带来一定的困扰。
下面贴出博主的代码,并给出了详细的解释。
#在…处填写多行代码
#在_____出填写一行代码
#可以修改其他代码
fi = open("xueyajilu.txt",'r',encoding='utf-8')
jl = [[],[],[],[],[],[]] # 1:zb_h, zb_l,yb_h,yb_l
#此处构造一个二维列表jl,用来存储本题的4个核心数据,即#zb_h,zb_l,yb_h,yb_l
#坑1:jl有6个元素,实际只用了4个
#坑2:存储是从jl[1]开始的, 1:zb_h算是个暗示吧
zyc = [] #左压差
yyc = [] #右压差
xl = [] #心率
ls = []
#初始化一个二维列表ls,这是我的习惯,对于这种二维CSV数据,习惯先将其映射到一个二维列表中
for l in fi:
ls.append(l.strip('\n').split(','))
for lls in ls:
for i in range(1,5):
jl[i].append(eval(lls[i]))
# 4个核心数据,从lls[1]开始,这里用循环构造jl列表
#用的eval(lls[i]),因为后面要计算
zyc.append(eval(lls[1])- eval(lls[2]))
yyc.append(eval(lls[3])- eval(lls[4]))
xl.append(eval(lls[5]))
fi.close()
cnt = len(ls)
res = []
#读懂题意,用res这个二维列表存储结果
#max(list),
res.append(list(("高压最大值", max(jl[1]),max(jl[3]))))
res.append(list(("低压最大值", max(jl[2]),max(jl[4]))))
res.append(list(("压差平均值", sum(zyc)//cnt,sum(yyc)//cnt)))
res.append(list(("高压平均值", sum(jl[1])//cnt,sum(jl[3])//cnt)))
#结果向下取整,暗示用//求平均值
res.append(list(("低压平均值", sum(jl[2])//cnt,sum(jl[4])//cnt)))
res.append(list(("心率平均值", sum(xl)//cnt,0)))
zbg = 0
ybg = 0
print('{:<10}{:<10}{:<10}'.format("对比项", "左臂", "右臂"))
for r in range(len(res)-1):
print('{:<10}{:<10}{:<10}'.format(res[r][0],res[r][1],res[r][2]))
if res[r][1] > res[r][2]:
zbg += 1
else:
ybg += 1
#注意:题意是基于结果res的5项数据决定左右臂血压高低的
if zbg > ybg:
print('结论:左臂血压偏高',end='')
elif zbg == ybg:
print('结论:左臂血压与右臂血压相当',end='')
else:
print('结论:右臂血压偏高',end='')
print(', 心率的平均值为{}'.format(res[5][1]))
实际运行结果:
对比项 左臂 右臂
高压最大值 168 155
低压最大值 93 90
压差平均值 62 60
高压平均值 147 141
低压平均值 85 81
结论:左臂血压偏高, 心率的平均值为63
小结:
刚开始上手是有点蒙的,上手做几次,多体会,感觉也没有那么难,核心还是读懂题意,领会框架意图,提高代码熟练度,还是可以搞定的!