成对比较:比较一个列表中的子列表
Pairwise Comparison: comparing sublists within one list
好的,所以我正在尝试编写一种计算排名选票的方法,称为成对比较。我应该指出,在编写各种意义上的代码时,我是一个完全的新手。到目前为止,我已经设法创建了选票(感谢该网站上的另一位用户)并根据位置将它们分成排名对。接下来,我需要将它们分成不同的列表,以便无论排名如何,每个有序对中的候选人都在一起(这是一个人如何确定候选人与其他候选人相比表现如何的一部分)。这是我到目前为止的代码:
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 组选票出于测试目的,因此无论定位如何,都应该有三个使用相同候选对象的有序对(稍后我需要定位来对候选对象进行评分)。任何正确方向的提示或建议将不胜感激!
我真的不确定你想用你的代码做什么。
由于您导入了 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
好的,所以我正在尝试编写一种计算排名选票的方法,称为成对比较。我应该指出,在编写各种意义上的代码时,我是一个完全的新手。到目前为止,我已经设法创建了选票(感谢该网站上的另一位用户)并根据位置将它们分成排名对。接下来,我需要将它们分成不同的列表,以便无论排名如何,每个有序对中的候选人都在一起(这是一个人如何确定候选人与其他候选人相比表现如何的一部分)。这是我到目前为止的代码:
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 组选票出于测试目的,因此无论定位如何,都应该有三个使用相同候选对象的有序对(稍后我需要定位来对候选对象进行评分)。任何正确方向的提示或建议将不胜感激!
我真的不确定你想用你的代码做什么。
由于您导入了 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