1

A>B>C>D>E のような投票用紙のリストと、A>B>C=D=E のような投票用紙のリストがあります。投票はテキスト ファイルにあり、各投票は独自の行にあります。各候補者に点数を割り当てたい。A>B>C>D>E の場合、A は 1 位になると 4 点、B は 3 点、C は 2 点、D は 1 点、E は 0 点になります。A>B>C=D=E の場合、A は獲得する必要があります。 4 ポイント、B は 3 を取得する必要があり、C、D、および E は同点であるため、残りの 3 ポイントを分割する必要があるため、それぞれが 1 になります。テキスト ファイル内のすべての投票をカウントし、投票を合計したい. これを行うための最も簡単な方法は何だと思いますか?

4

1 に答える 1

4
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}
于 2012-02-11T18:32:06.370 に答える