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

问题描述 投票:1回答:1

首先,我有一个文本文件,显示以下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的配额。我不知道如何编码一个函数,以便将每个候选人的第一个偏好投票加在一起。

python arrays
1个回答
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]
© www.soinside.com 2019 - 2024. All rights reserved.