引子
事情是这样的,我们单位最近召开新一届党委和纪委会,需要选举新一届党委委员和纪委委员,选举的方式采用差额选举。党委委员候选人9名(7名+2名差额),纪委委员候选人6名(5名+1名差额)。应到参会代表75人,实到参会代表71人。
到会的每位代表都有两张选票。每张选票的每一名候选人姓名上方是一个空表格,赞成画圈⭕️,反对画✖️,弃权空白。
作为计票人,收上来的选票中,每个人选票结果是不一样的,需要统计出候选人赞成多少票,反对多少票,弃权多少票,然后根据投票的多少排序,最后输出姓名和对应的选票。
我们的计票人员居然还在用画“正”字来统计票数,不禁唏嘘!正好我在学习python,萌生用代码来解决这个问题。
程序设计思路
- 需要告诉程序候选人的数量
- 需要输入候选人的姓名
- 需要输入每一张选票的结果,用数字1代表赞成,数字2代表反对,数字0代表弃权。
- 将所有选票的赞成票、反对票及弃权票进行汇总
- 最终输出结果:姓名对应赞成票数,就可以看出来候选人获得的赞成票了和顺序了
代码
"""
给候选人投票,分赞成、反对和弃权
统计每个候选人的赞成、反对和弃权票总数
version:0.1
author:chris
"""
name_list = []
agree_list = []
opposition_list = []
abstention_list = []
result_list = []
a = k = n = 0
j = int(input("请问有几名候选人?:")) # 确定候选人的数量
# 下面的代码是根据确定的候选人数量,将赞成、反对和弃权的列表初始化,每个索引位置都为零。
while a < j:
agree_list.append(0)
opposition_list.append(0)
abstention_list.append(0)
a += 1
# 下面的代码是把候选人的姓名构建成一个list
while k < j:
i = input("请输入第%d个候选人姓名:" % (k+1))
name_list.append(i)
k += 1
vote_num = int(input("请问有多少张选票?"))
# 下面的代码作用是通过输入的每一张选票结果,分别统计出对应候选人的赞成票、反对票和弃权票的情况
while n < vote_num:
n += 1
vote = input("请输入第%d张选票结果:" % n)
for i in range(j):
if int(vote[i]) == 1:
agree_list[i] += 1
elif int(vote[i]) == 2:
opposition_list[i] += 1
elif int(vote[i]) == 0:
abstention_list[i] += 1
else:
print("选票无效作废")
print("选票结果如下:")
print(name_list)
print("赞成票", agree_list)
print("反对票", opposition_list)
print("弃权票", abstention_list)
# 下面构建一个字典,键是候选人姓名,值是赞成票票数
print("整理后的选票情况如下:")
dict_vote = {}
for m in range(j):
dict_vote.update({name_list[m]: agree_list[m]})
print(dict_vote)
运行结果
请问有几名候选人?:6
请输入第1个候选人姓名:a
请输入第2个候选人姓名:b
请输入第3个候选人姓名:c
请输入第4个候选人姓名:d
请输入第5个候选人姓名:e
请输入第6个候选人姓名:f
请问有多少张选票?5
请输入第1张选票结果:112111
请输入第2张选票结果:101111
请输入第3张选票结果:211111
请输入第4张选票结果:111211
请输入第5张选票结果:011111
选票结果如下:
['a', 'b', 'c', 'd', 'e', 'f']
赞成票 [3, 4, 4, 4, 5, 5]
反对票 [1, 0, 1, 1, 0, 0]
弃权票 [1, 1, 0, 0, 0, 0]
整理后的选票情况如下:
{'a': 3, 'b': 4, 'c': 4, 'd': 4, 'e': 5, 'f': 5}
小结
经过努力,基本实现了最初的目的。但是程序里面还有需要改进的地方,比如最终结果根据票数排序,赞成、反对和弃权显示结果和字典格式显示结果存在重复现象,通过差额选举的方式,告诉哪些人当选了等。
其实,我最初的设想是将代码打包成图形界面,上面是候选人姓名,下面对应位置可以点击赞成、反对或者弃权,最后可以导出投票结果。
后续我将对程序进行改进。
网友评论