使用Python进行Borda计数?

2 投票
1 回答
3511 浏览
提问于 2025-04-17 12:51

我有一份投票列表,格式像是 A>B>C>D>E,还有一些是 A>B>C=D=E。每一份投票都在一个文本文件里,每行一份。我想给每个候选人分配分数。对于 A>B>C>D>E,A 因为排在第一,所以得 4 分,B 得 3 分,C 得 2 分,D 得 1 分,而 E 得 0 分。对于 A>B>C=D=E,A 得 4 分,B 得 3 分,因为 C、D 和 E 是平局,所以他们要平分剩下的 3 分,每个人得 1 分。我想把文本文件里的所有投票都计算在内,把分数加起来。你觉得最简单的方法是什么呢?

1 个回答

5
import itertools
import collections

def borda(ballot):
    n = len([c for c in ballot if c.isalpha()]) - 1
    score = itertools.count(n, step = -1)
    result = {}
    for group in [item.split('=') for item in ballot.split('>')]:
        s = sum(next(score) for item in group)/float(len(group))
        for pref in group:
            result[pref] = s
    return result

def tally(ballots):
    result = collections.defaultdict(int)
    for ballot in ballots:
        for pref,score in borda(ballot).iteritems():
            result[pref]+=score
    result = dict(result)
    return result

ballots = ['A>B>C>D>E',
           'A>B>C=D=E',
           'A>B=C>D>E', 
           ]

print(tally(ballots))
{'A': 12.0, 'C': 5.5, 'B': 8.5, 'E': 1.0, 'D': 3.0}

产生

撰写回答