选手名称与选手代码的对应关系如下表:
选手名称 | 选手 A | 选手 B | 选手 C | 选手 D | 选手 E | 选手 F | 选手 G | 选手 H |
选手代码 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
小明用Python编写了一个统计得票数的程序,用于检查每位大众评委的投票是否有效(每人投3票且不重复),并对有效结果进行统计,按照得票数从高到低输出投票结果,如图b所示。
若存在并列且前三名总人数超过3人,则输出所有满足条件的选手,并通过随机抽奖形式在末位同分同学中抽取参赛学生,如图c所示,在选手C、E、H中抽取一位同学作为第三名。
图a
图b
图 c
from random import randint
def check(x): #检测投票是否有效
flag=False
sum,checklist=0,[0]*8
if len(x)==3:
for i in range(3):
if "0"<=x[i]<="7":
checklist[int(x[i])]=1
for i in range(8):
sum+=checklist[i]
if :
flag=True
return flag
dict={0:"选手 A",1:"选手 B",2:"选手 C",3:"选手 D",4:"选手 E",5:"选手 F",6:"选手 G",7:"选手 H"}
f=open("vote.txt","r")
line=f.readline() #第一行为列标题,读取两次跳过该行
line=f.readline()
count=[0]*8
while line:
linelist=line.split(",") #将字符串按逗号分隔为列表
if check(s):
for i in range(3):
count[int(s[i])]+=1
line=f.readline()
f.close()
a=[]
for i in range(8):
a.append([dict[i],count[i]])
#将列表 a 按照选手票数从高到低排序并输出,代码略
m=3 #入选人数
b=[a[0]] ;k=1;st=0
for i in range(1,len(a)):
if :
break
if a[i][1]!=a[i-1][1]:
st=i
k+=1
b.append(a[i])
print("满足条件的选手:")
for i in range(k):
print(b[i]) #输出满足票数前 m 条件的参赛选手
#输出最终入选人员
print("最终入选人员:")
for i in range(st):
print(b[i])
#末位同分的同学, 用抽奖的方式确定入选人员
flag = [0] * k
while d>0:
lucky=randint(st,k-1)
if flag[lucky]==0:
print(b[lucky])
flag[lucky]= 1
d-=1
#在最后同分的同学中随机抽取