问题是:
voting_borda:
(str列表清单) - >元组(str,int of int)
该参数是一个4元素列表的列表,代表单次骑行的等级选票。
Borda Count通过根据排名分配点来确定。每个第一选择排名获得3分,每个第二选择排名获得2分,每个第三选择排名获得1分。 (因排名第四而没有得分。)例如,上面显示的排名选票将为自由党统计贡献3分,绿色统计分2分,CPC分数1分。得分最高的一方赢得了席位。
根据Borda Count返回一个元组,其中第一个元素是获胜方的名称,第二个元素是包含每个方的总点数的四元素列表。列表元素的顺序对应于PARTY_INDICES中各方的顺序。
这是我的代码:
def voting_borda(*args):
results = {}
for sublist in args:
for i in range(0, 3):
if sublist[i] in results:
results[sublist[i]] += 3-i
else:
results[sublist[i]] = 3-i
winner = max(results, key=results.get)
return winner, results
但是,如果我尝试
voting_borda(['GREEN','NDP', 'LIBERAL', 'CPC'],['GREEN','CPC','LIBERAL','NDP'],['LIBERAL','NDP', 'CPC', 'GREEN'])
我明白了,
('GREEN', {'NDP': 4, 'CPC': 3, 'GREEN': 6, 'LIBERAL': 5})
但是,我希望第一个参数是胜利者(那部分没问题),第二个参数只是值,也是PARTY_INDICES的顺序。
PARTY_INDICES = [NDP_INDEX, GREEN_INDEX, LIBERAL_INDEX, CPC_INDEX]
。
我可以做得更好的任何解决方案或方法吗?
答案 0 :(得分:0)
PARTY_INDICES = ['NDP_INDEX', 'GREEN_INDEX', 'LIBERAL_INDEX', 'CPC_INDEX']
party_dic = {}
for i, item in enumerate(PARTY_INDICES):
party_dic[item.split('_')[0]] = i
print party_dic
def voting_borda(*args):
results = {}
for sublist in args:
for i in range(0, 3):
if sublist[i] in results:
results[sublist[i]] += 3-i
else:
results[sublist[i]] = 3-i
winner = max(results, key=results.get)
results = [v for k, v in sorted(results.items(), key = lambda x: party_dic[x[0]])]
return winner, results
print voting_borda(['GREEN','NDP', 'LIBERAL', 'CPC'],['GREEN','CPC','LIBERAL','NDP'],['LIBERAL','NDP', 'CPC', 'GREEN'])
{'NDP': 0, 'CPC': 3, 'GREEN': 1, 'LIBERAL': 2}
('GREEN', [4, 6, 5, 3])