首先,我有一个文本文件,显示以下4个选票中5名候选人的投票分数:
1,2,3,0,0
2,3,1,0,0
3,1,0,0,2
0,2,0,3,1
选民提出他们的前三个偏好,其余两个候选人获得零。
使用下面的程序,每个候选人的每个分数都会被放入一个2维数组中,并计算出配额。
with open("textdata.txt","r") as f:
ReadTextFile = f.read()
RawVotesArray = ReadTextFile.split("\n")
TwoDArrayRows = [item for item in RawVotesArray if item != ""]
TwoDArrayRows = [item.split(",") for item in TwoDArrayRows]
print(TwoDArrayRows)
CandidateA = [row[0] for row in TwoDArrayRows]
Preference1CA = CandidateA.count("1")
CandidateB = [row[1] for row in TwoDArrayRows]
Preference1CB = CandidateB.count("1")
CandidateC = [row[2] for row in TwoDArrayRows]
Preference1CC = CandidateC.count("1")
CandidateD = [row[3] for row in TwoDArrayRows]
Preference1CD = CandidateD.count("1")
CandidateE = [row[4] for row in TwoDArrayRows]
Preference1CE = CandidateE.count("1")
ValidVotes = 4
NumberOfSeats = 2
quota = int((ValidVotes/(NumberOfSeats + 1))+1)
print(quota)
输出到:
[['1','2','3','0','0'],['2','3','1','0','0'],[' 3','1','0','0','2'],['0','2','0','3','1']] 2
最后的2是配额。对于候选人来说,他们的首选投票(1s)的总数必须达到或超过2的配额。我不知道如何编码一个函数,以便将每个候选人的第一个偏好投票加在一起。
答案 0 :(得分:0)
你需要小心你在想什么。如果你密切关注,你计算的是"1"
,但由于你阅读投票的方式,你可以"1"
或" 1"
。要解决此问题,请逐行阅读您的文件,并使用.strip()
删除所有前导/尾随空格:
votes = []
with open("textdata.txt","r") as f_input:
for line in f_input:
if len(line.strip()):
votes.append([value.strip() for value in line.split(',')])
这也将删除每行中最后一个值的尾部换行符。然后votes
将包含:
[['1', '2', '3', '0', '0'], ['2', '3', '1', '0', '0'], ['3', '1', '0', '0', '2'], ['0', '2', '0', '3', '1']]
要累计所有首选项投票,您可以使用index()
告诉您1
在列表中的位置(0
是第一个位置)。有了这个,你可以使用一个计数器列表保持每个的总数:
candidate_first_pref = [0, 0, 0, 0, 0]
for vote in votes:
candidate_first_pref[vote.index('1')] += 1
print(candidate_first_pref)
所以最后你的candidate_first_pref
会:
[1, 1, 1, 0, 1]