Попарное сравнение: сравнение подсписков в одном списке

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

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 набора голосов для цели для целей тестирования, поэтому должно быть три упорядоченных пары, использующих одних и тех же кандидатов, независимо от позиционирования (позже мне понадобится позиционирование, чтобы оценить кандидатов) Буду очень признателен за любые советы или предложения в правильном направлении!


person Katherine K    schedule 02.04.2016    source источник


Ответы (1)


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

Поскольку вы импортировали collections, похоже, вы знаете, что Counter — хороший инструмент для подсчета результатов попарных сравнений. Я бы перебирал пары кандидатов, используя:

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
person Jared Goguen    schedule 02.04.2016