2016-04-02 86 views
1

好的內比較子列表,所以我想寫計數稱爲成對比較排名選票的方法。我應該指定,我是一個完整的新手,當涉及到的每一個詞的意義上編寫代碼。到目前爲止,我已經成功地創造了選票(感謝這個網站的其他用戶),並根據他們的位置分成排名對。接下來,我需要把它們分成不同的列表,以便在每個有序對考生在一起秩無關(這是一個如何確定候選人如何相較於其他人做的一部分)。這裏是我到目前爲止的代碼:成對比較:一個列表

import itertools 
import random 
import collections 
candidates = ['Trump', 'Cruz', 'Rubio', 'Carson', 'Fiorina'] 
def simul_ballots(num_voters): 
    ballots = [] 
    choice = candidates[:] 
    for _ in range(num_voters): 
     random.shuffle(choice) 
     ballots.append(choice[:]) 
    return ballots 
n=3 
ballots = simul_ballots(n) 
i=0 
m=0 
oPairs = [] 
while i < n: 
    for a, b in itertools.combinations(ballots[i], 2): 
     x = (a,b) 
     x 
     ops = list(x) 
     oPairs.append(ops) 
    i += 1 
oPairs 

l = len(oPairs)-1 
k=0 
j=(k+1) 
while (k < l): 
    print oPairs[k] 
    while (j < l): 
     #if all (x in oPairs[i] for x in oPairs[j]): 
     if (set(oPairs[k])==set(oPairs[j])): 
      print oPairs[j] 
      j+=1 
    k+=1 

到目前爲止,我被困在這最後一節。我似乎無法理解如何給每個子列表進行比較,以其他(不重複,其重要的是有子列表相同數量的,我開始在這個例子中,我只產生3套票爲目的出於測試目的,所以應該有三個有序對使用相同的考生,無論定位的(我需要定位後,以高分考生)。在正確的方向上沒有任何提示或建議,將不勝感激!

回答

0

我我不知道你在用你的代碼做什麼

既然你已經導入了collections,好像你可能知道Counter是一個很好的工具來計算兩兩比較的結果, d迭代罐對使用didates:

for can1, can2 in combinations(candidates, 2): 

然後,遍歷每次投票:

for ballot in ballots: 

如果can1首先出現在選票,他們拿到一分,否則can2得一分。這可以通過檢查:

if ballot.index(can1) < ballot.index(can2): 

選票統計出來(對於僅此一對)後,如果can1贏得了更多的選票,他們拿到一分,否則,如果can2贏得了更多的選票,他們拿到一分東西,他們都得到了半分。

把所有這些組合起來可能看起來像:

from collections import Counter 

vote_counter = Counter() 

for can1, can2 in combinations(candidates, 2): 
    count1, count2 = 0, 0 

    for ballot in ballots: 
     if ballot.index(can1) < ballot.index(can2): 
      count1 += 1 
     else: 
      count2 += 1 

    if count1 > count2: 
     vote_counter[can1] += 1 
    elif count1 < count2: 
     vote_counter[can2] += 1 
    else: 
     vote_counter[can1] += 0.5 
     vote_counter[can2] += 0.5