2016-04-02 8 views
1

Хорошо, поэтому я пытаюсь написать метод подсчета ранжированных бюллетеней, известных как Pairwise Comparison. Я должен указать, что я полный новичок, когда дело доходит до написания кода во всех смыслах этого слова. До сих пор мне удалось создать бюллетени (спасибо другому пользователю на этом сайте) и разделить их на ранжированные пары в соответствии с положением. Затем мне нужно разделить их на разные списки, чтобы кандидаты в каждой упорядоченной паре были вместе независимо от ранга (это часть того, как человек определяет, насколько хорошо кандидат делает по сравнению с другими). Вот код, который у меня есть до сих пор:Сравнение Pairwise: сравнение подсписок в одном списке

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

I ' действительно не уверен, что вы пытаетесь сделать с вашим кодом.

Поскольку вы импортировали collections, кажется, что вы знаете, что Counter - хороший инструмент для подсчета результатов попарных сравнений. d итерации по парам can 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