Borda Count использует python? - PullRequest
0 голосов
/ 11 февраля 2012

У меня есть список бюллетеней, которые выглядят как 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 Ответ

3 голосов
/ 11 февраля 2012
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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...