用于STV投票系统的Python程序,为每个候选人添加所有首选投票

时间:2018-03-04 16:54:32

标签: python arrays

首先,我有一个文本文件,显示以下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 个答案:

答案 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]