实验九 二维列表
1. 血压统计
血压的正常范围是 60mmHg<舒张压<90mmHg 90mmHg<收缩压<140mmHg 输入小张测量血压的日期,舒张压和收缩压,存放到列表xy中 将小张血压不正常次数百分比计算并显示出来 将小张血压不正常的日期,舒张压和收缩压显示出来
python
xy=[]
str1=input("")
while(str1!="end"):
xyxm=str1.split(",")
xy.append([xyxm[0],eval(xyxm[1]),eval(xyxm[2])])
str1=input("")
#代码开始
bzc = []
count = 0
for i in xy:
if 60<i[1]<90 and 90<i[2]<140:
count += 1
else:
bzc.append(i)
bfb = (1-count/len(xy))*100
#代码结束
print("不正常次数百分比{:.2f}".format(bfb))
for x in bzc:
print("日期{}舒张压{}收缩压{}".format(x[0],x[1],x[2]))
2. 查找中心点
编写一个能查找中心点的小程序
输入若干个逗号分隔的各点的横纵坐标(例如2,3),直到输入end为止。 计算出各点与其余各点的距离之和,并找出中心点(即该点到其他各个点的距离之和最小的点) 显示中心点的序号、坐标和与各点的距离之和
python
zb=[]
z=input()
while(z!="end"):
x,y=z.split(',')
zb.append([eval(x),eval(y)])
z=input()
#代码开始
lb = []
for i in range(len(zb)):
s = 0
for j in range(len(zb)):
if i != j:
s += ((zb[i][0]-zb[j][0])**2+(zb[i][1]-zb[j][1])**2)**0.5
lb.append(s)
i = lb.index(min(lb))
mins = min(lb)
#代码结束
print("最小值为第{}点坐标为({},{})距离之和为{:.2f}".format(i+1,zb[i][0],zb[i][1],mins))
3. 歌手评分计算
编写一个计算歌手实际得分的小程序。 十位评委对六位歌手打分,六位歌手的得分数据如fs列表所示。计算每位歌手的实际得分,即去掉一个最高分、一个最低分的平均分,按从高到低的顺序,输出前3名的名次、姓名和实际得分(保留两位小数) 格式为,第1名姓名zhang分数9.59
统计数据
通过下列函数可以对元组、列表、集合等求统计数据
|-----|-----|------|------|
| sum | len | max | min |
| 求和 | 求个数 | 求最大值 | 求最小值 |
排序二维列表
当二维列表s需要按指定列(第二列)的顺序排序时 s.sort(key=lambda x:x[1])
lambda是一个匿名函数,是固定写法; x表示匿名函数的输入,即列表中的一个元素,在这里,表示一个元组,x只是临时起的一个名字,你可以使用任意的名字; x[1]表示匿名函数的输出,即元组里的第二个元素
python
fs=[['zhang',9.5,9.8,9.7,9.6,9.5,9.9,9.6,9.2,9.3,9.7],
['huang',8.5,8.8,7.7,7.6,8.5,8.3,9.1,7.8,7.5,9.3],
['liu',9.5,8.8,7.2,9.6,8.5,6.5,6.3,7,6.9,9],
['chen',9.5,9.8,8.7,8.6,7.5,8.8,8.1,9.3,9.2,9.9],
['lin',9.9,7.8,7.5,7.2,6.5,9.1,9.2,9.3,8.5,8.2],
['ye',9.8,6.8,6.2,9.3,7.5,8.3,9.1,9.4,8.7,8.9]]
lbs = []
for i in fs:
lb = []
sum1 = 0
max1 = 0
min1 = 10
lb.append(i[0])
for j in range(1,len(i)):
min1 = min(min1,i[j])
max1 = max(max1,i[j])
sum1 += i[j]
lb.append(max1)
lb.append(min1)
fs = (sum1 - max1 - min1) / (len(i) - 3)
lb.append(fs)
lbs.append(lb)
lbs.sort(key=(lambda x:x[3]),reverse=True)
n= 1
for i in lbs:
print("第{}名姓名{}分数{:.2f}".format(n,i[0],i[3]))
n += 1
if n > 3:
break
4. 计算工资文件
编写一个根据《工资文件.csv》计算每位员工的工资的小程序。 工资文件.csv如下图所示,姓名,底薪,正常工时和加班工时 每位员工的工资为底薪与正常工时薪金、加班工时薪金之和。 正常工时每小时30元,加班工时每小时60元 然后将所有员工的工资按降序排列,显示姓名和工资
如何分隔字符为列表
split通过指定分隔符对字符串进行切片,形成一个列表 str.split(str="", num=string.count(str)) str -- 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
x="12,mary,90,80,70"
y=x.split(",")
y
['12','mary','90','80','70']
如何排序二维列表
当二维列表按第i+1列的顺序排列
lb.sort(key=lambda x:x[i],reverse)
reverse默认为False 升序排列
指定reverse=True 降序排列
python
f1=open("sy8//工资情况.csv","r",encoding="utf-8")
jg=[]
#代码开始
for i in f1.readlines():
i = i.strip()
f = i.split(",")
s = int(f[1]) + 30*int(f[2]) + 60*int(f[3])
jg.append([f[0],s])
jg.sort(key=(lambda x:x[1]),reverse=True)
f1.close()
#代码结束
for y in jg:
print("姓名{:8}\t工资{}".format(y[0],y[1]))
5. 列表处理
有一个3行3列的列表xlit,每个元素都为整数 编写程序,生成一个3行3列的列表ylist,若xlist的值大于其所有元素的平均值,则ylist该位置上的值为1,否则为0
python
xlist=[]
for i in range(3):
xlist.append([])
for j in range(3):
x=eval(input(""))
xlist[i].append(x)
#代码开始
sum1 = 0
for i in range(len(xlist)):
for j in range(len(xlist[0])):
sum1 += xlist[i][j]
n = int(sum1/9)
ylist = []
for i in range(3):
ylist.append([])
for j in range(3):
if xlist[i][j]>=n:
ylist[i].append(1)
else:
ylist[i].append(0)
#代码结束
for i in range(3):
for j in range(3):
print(ylist[i][j],end="")
print()
6. 用户文件增加
pd.csv文件中每行存储逗号分隔的的用户名和密码
用户输入要增加的用户名和密码 若用户已存在,显示用户已存在 若用户不存在,将该用户名和密码追加在文件最后 并按以下格式显示所有用户名和密码 用户名mary 密码123456
python
f1=open("sy8\\pd.csv","r")
yhm=input("用户名")
mm=input("密码")
#代码开始
lb = []
for i in f1.readlines():
f = i.strip()
f = f.split(",")
lb.append(f)
n = 0
for i in range(len(lb)):
if lb[i][0]==yhm and lb[i][1]==mm:
print("用户已存在")
n = 1
break
if n == 0:
ls = yhm + "," + mm + "\n"
f3 = open("sy8\\pd.csv","a+")
f3.write(ls)
f3.close()
f1.close()
#代码结束
f2=open("sy8\\pd.csv","r")
for line in f2:
yh=line.strip("\n").split(",")
print("用户名{}密码{}".format(yh[0],yh[1]))
f2.close()
7. 用户文件删除
pd文件中每行存储逗号分隔的用户名和密码
输入用户名,若用户不存在,显示该用户不存在。 若用户存在,则删除文件中该用户信息(需要重新将内容写入文件),并按下列格式显示文件信息 用户名harry 密码 888888
python
f1=open("sy8\\pd.csv","r")
yhm=input("用户名")
#代码开始
lb = []
for i in f1.readlines():
i = i.strip()
i = i.split(",")
lb.append(i)
f1.close()
n = 0
f3 = open("sy8\\pd.csv","w")
for i in lb:
if i[0]==yhm:
n = 1
lb.remove(i)
if n == 0:
print("该用户不存在")
for i in lb:
f3.write(i[0]+","+i[1])
f3.write("\n")
f3.close()
#代码结束
f2=open("sy8\\pd.csv","r")
for line in f2:
yh=line.strip("\n").split(",")
print("用户名{}密码{}".format(yh[0],yh[1]))
f2.close()
8. 用户文件修改密码
pd文件中每行存储逗号分隔的用户名和密码
首先用户输入用户名和密码, 若用户名或密码错误,显示用户名或密码错误。 若用户名和密码正确,输入两次新密码,若两次新密码不一致,显示两次密码不一致。若两次密码一致,可将pd文件中相应的密码修改。
python
f1=open("sy8\\pd.csv","r")
yhm=input("用户名")
mm=input("密码")
#代码开始
lines = f1.readlines()
n = 0
for i in lines:
yh = i.strip().split(",")
if (yh[0]==yhm and yh[1]!=mm) or (yh[0]!=yhm and yh[1]==mm):
print("用户名或密码错误")
break
elif yh[0]==yhm and yh[1]==mm:
n1 = input("新密码")
n2 = input("新密码")
if n1 != n2:
print("两次密码不一致")
else:
n = 1
f1.close()
if n == 1:
f3 = open("sy8\\pd.csv","w")
for i in lines:
if mm in i:
i = i.replace(mm,n1)
f3.write(i)
f3.close()
#代码结束
f2=open("sy8\\pd.csv","r")
for line in f2:
yh=line.strip("\n").split(",")
print("用户名{}密码{}".format(yh[0],yh[1]))
f2.close()