我有一张看起来像A> B> C> D> E的选票清单,其中有些看起来像A> B> C = D = E。选票位于文本文件中,每个选票都位于单独的行中。我想为每个候选人分配点值。对于A> B> C> D> E,A应该先获得4分,B应该获得3,C 2,D 1和E0。对于A> B> C = D = E,A应该获得B得4分,B应该得3分,由于C,D和E并列,所以他们应该将剩下​​的3分分开,所以他们每人得1分。我希望计算文本文件中的所有选票并将票数加起来。您认为这样做最简单的方法是什么?

最佳答案

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}

关于python - 使用python的Borda Count?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9242450/

10-09 00:02