2012-02-11 37 views
0

我有一張看起來像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分。我希望將文本文件中的所有選票都計算在內,並將選票加起來。你認爲最簡單的方法是什麼?使用Python的Borda計數?

+1

這個網站是爲特定的編程問題。總的想法應該是相當明顯的(閱讀線,解析,分配點,總結),所以開始並詢問何時出現問題*實施*步驟。 – 2012-02-11 17:55:25

回答

2
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}