嘿,伙计们,我正试图写一个问题的代码,我有麻烦推断我应该如何做到这一点。你知道吗
所以我必须为即时决选投票或替代投票系统编写代码。基本上,这里有一个嵌套的列表,其中每个列表都是一张有排名的选票。举个例子,如果这个名单看起来像:[‘共和党’,‘民主党’,‘绿色’],这意味着在这次投票中,第一选择是共和党,然后是民主党,然后是绿色。因此,基本上在嵌套列表中有多张选票,函数需要为所提到的所有政党创建一个计数,该计数将显示特定政党的第一选择是多少张选票。例如,如果有6张选票,而其中3张或更多的选票是共和党人的首选,那么选举就应该结束。如果没有一个政党获得多数票,那么得票最低的政党将被淘汰,你重新计算该政党是第一选择的选票,但这次你算作第二选择。你一直这样做,直到你有一个多数,并返回一个字典与计数为所有各方(计数将是0,如果各方将被淘汰,但必须返回)。你知道吗
举个例子:
>>> count_irv([[’REP’], [’DEM’, ’REP’, ’LIB’], [’GRN’,’REP’], [’GRN’], [’REP’, ’DEM’], [’LIB’, ’DEM’, ’REP’], [’LIB’, ’CON’], [’GRN’, ’DEM’], [’REP’]])
{’LIB’: 0, ’CON’: 0, ’DEM’: 0, ’GRN’: 3, ’REP’: 5}
这是我目前掌握的代码:
def count_irv(ballots)
count = {}
for list in ballots:
for element in list:
if element in count:
count[element] += 1
else:
count[element] = 1
for key in count:
if count[key] >= len(ballots):
return count
else:
count[last_place(count)] = 0
return count
其中last_place
函数只返回字典中具有最低值的键。你知道吗
使用上面的代码,例如提供的示例,代码返回:
{'REP': 6, 'DEM': 4, 'LIB': 3, 'GRN': 3, 'CON': 0}
所以本质上我需要帮助的是弄清楚如何使我的代码保持循环,直到有一个政党获得多数票。你知道吗
另外,我是新来的,到目前为止我很享受我的经历。然而,有人报告了我没有把代码在正确的方式上的最后一篇文章,我被禁止了一天,所以我会很感激如果有什么我应该做不同的,请留下评论下面,我一定会作出适当的编辑,并为我的下一篇文章考虑它。谢谢!你知道吗
让
ballots = [['REP'], ['DEM', 'REP', 'LIB'], ['GRN','REP'], ['GRN'], ['REP', 'DEM'], ['LIB', 'DEM', 'REP'], ['LIB', 'CON'], ['GRN', 'DEM'], ['REP']]
简短而简单的解决方案是
您可以使用递归函数来计算选票,检查是否有赢家,如果没有赢家,则删除输家,并使用更新的选票再次调用该函数。你知道吗
输出
更新
我不知道为什么您不想使用collections模块,但是您可以用几行代码来替换它,以便在每次看到一个party时计数并更新dict counter值。然后按照从高到低的顺序对dict中的项目进行排序
这看起来更像是一个逻辑错误而不是一个编码错误。马上,我注意到这段代码:
将每个人的第二和第三选择选票登记为第一选择总数的一部分。你知道吗
我建议添加一些print语句以进行调试,这样您就可以读回计数如何更新的跟踪。一些注释和类型注释可以帮助您遵循代码应该执行的操作,这也不会有什么坏处!你知道吗
下面是对函数的一个非常快速的第一步,以便在不更改实际逻辑的情况下更易于调试/读取:
因为您没有包含
last_place
函数,所以我只是将其替换为执行您描述的操作的内置min
函数;我还使用了defaultdict
来简化初始计数。你知道吗运行这段代码,您可以看到投票总数开始时是错误的,IRV逻辑没有任何希望纠正它们;它击退了排名靠后的候选人,但它不会将任何投票转移给其他候选人,每次通过循环,它只是将同一个排名靠后的候选人归零。更好的方法可能是:
相关问题 更多 >
编程相关推荐