我有一个看起来像 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。我希望计算文本文件中的所有选票并将选票相加. 您认为最简单的方法是什么?
问问题
2663 次
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 回答