成对比较:比较一个列表中的子列表

时间:2016-04-02 22:32:52

标签: python voting

好的,所以我正在尝试编写一种计算排名选票的方法,称为成对比较。我应该指出,在编写代码的每个意义上,我都是一个完整的新手。到目前为止,我已设法创建选票(感谢本网站上的其他用户)并根据位置将它们分成排名对。接下来,我需要将它们分成不同的列表,以便每个有序对中的候选者在一起而不考虑等级(这是一个人如何确定候选人与其他人相比做得多好的一部分)。这是我到目前为止的代码:

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组投票为了测试目的,所以应该有三个有序的对使用相同的候选人,无论定位(我将需要稍后定位以给候选人评分)。任何有正确方向的提示或建议将不胜感激!

1 个答案:

答案 0 :(得分:0)

我真的不确定你要对你的代码做什么。

由于您已导入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