请实现一个计票统计系统。你会收到很多投票,其中有合法的也有不合法的,请统计每个候选人得票的数量以及不合法的票数。
(注:不合法的投票指的是投票的名字不存在n个候选人的名字中!!)
数据范围:每组输入中候选人数量满足 1 \le n \le 100 \1≤n≤100 ,总票数量满足 1 \le n \le 100 \1≤n≤100
输入描述:第一行输入候选人的人数n,第二行输入n个候选人的名字(均为大写字母的字符串),第三行输入投票人的人数,第四行输入投票。
输出描述:按照输入的顺序,每行输出候选人的名字和得票数量(以" : "隔开,注:英文冒号左右两边都有一个空格!),最后一行输出不合法的票数,格式为"Invalid : "+不合法的票数。
输入:
4
A B C D
8
A D E CF A GG A B
输出:
A : 3
B : 1
C : 0
D : 1
Invalid : 3
说明:E CF GG三张票是无效的,所以Invalid的数量是3.
def exam(fnum,snum,fname,sname):
f_index = fname.index
dic_value = [0 for i in range(fnum)]
dic_key = [i for i in fname]
dic_f = dict(zip(dic_key,dic_value))
# 输入key值顺序正规,则输出dic也顺序正规
# {'HSBML': 0, 'WJ': 0, 'YMVKBIO': 0, 'XRPY': 0, 'Y': 0, 'UE': 0, 'QJP': 0, 'PKEDB': 0}
# print(dic_f)
for i in sname:
for j in fname:
# 存在叫Lilei的人,也有叫Li的人,出现重复会统计错误,需判断长度是否一致
if i in j and len(i) == len(j):
dic_f[i] += 1
# print(dic_f)
# {'HSBML': 0, 'WJ': 0, 'YMVKBIO': 0, 'XRPY': 1, 'Y': 0, 'UE': 1, 'QJP': 0, 'PKEDB': 1}
for k,v in dic_f.items():
# 打印时候,会自动出现空格,所以不需要加空格,直接针对items每一项进行打印
print(k,":",v)
# cnt = len(set(sname) - set(fname))
# Invalid : 1
# MK FWX IN ET ET MK MK MK IN MK FWX FWX MK FWX FWX FWX ET ET ET IN FWX ET MK ET IN IN FWX IN ET IN ET IN IN MK FWX ET ET FWX MK MK MK IN
# 报错 set去重复后把相同的去掉了
cnt = 0
no_set = set(sname) - set(fname)
for i in no_set:
for j in range(len(sname)):
# 不能直接 i和j用in判断,查到1个则+1,实际上有N个,in看到有1个则返回了,只能用range
if i == sname[j]:
cnt +=1
print('Invalid :',cnt)
fnum = int(input().strip())
fname = input().strip().split(' ')
snum = int(input().strip())
sname = input().strip().split(' ')
exam(fnum=fnum,snum=snum,fname=fname,sname=sname)
# 15
# FCX XB GTFO CLEQV NSRWUTMGJU HBHE GWWEN KLSEXM BAGV FX GKPR H NENVUW GCXFCA AU
# 18
# GKPR HBHE GKPR GWWEN BAGV BAGV GWWEN GCXFCA XB H NENVUW H GWWEN GCXFCA H CLEQV BAGV GWWEN
# FCX : 0
# XB : 1
# GTFO : 0
# CLEQV : 1
# NSRWUTMGJU : 0
# HBHE : 1
# GWWEN : 4
# KLSEXM : 0
# BAGV : 3
# FX : 0
# GKPR : 2
# H : 3
# NENVUW : 1
# GCXFCA : 2
# AU : 0
# Invalid : 0