首先,我有一个文本文件,显示以下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的配额。我不知道如何编码一个函数,以便将每个候选人的第一个偏好投票加在一起。
你需要小心你在想什么。如果你仔细观察,你正在计算"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]