1

我正在编写一个函数来根据多数在系统中选择获胜者。如果没有多数,那么我需要删除得票最少的选择并继续进行,直到有多数票的获胜者。例如,

voting({'a':12, 'b':9, 'd':4})

在这种情况下,'a'有 12 票、'b'9 票和'd'4 票。由于'a'没有多数票(12/25 票),我需要'd'从可用选择中删除,它将获得多数票(12/21)。每个“选票”中可能有任意数量的选择,重要的是每个选项中的第一个。

我的代码是def voting(votes)

d = {}
winning_party = ''
i = 0
for key in votes.keys():
    d[key] = votes[key]
while winning_party == '':
    for key, vote in d.items():
        if d[key] > 0.5 * sum(d.values()):
            winning_party = key
            return winning_party
        else:
            if d[key] == min(d.values()):
                del d[key]

我尝试进行一些小的更改,但我得到一个错误,即字典在迭代期间改变了大小,或者函数停止工作。

谁能帮我修复代码,或者告诉我如何避免在循环中更改字典?我只能真正使用上面的代码,即我不能导入任何东西或使用除基本功能以外的任何东西。

4

3 回答 3

2
while winning_party == '':
    total_votes = sum(d.values())    # Recompute the total before each iteration.
    for key, vote in d.items():
        if d[key] > 0.5 * total_votes:
            winning_party = key
            return winning_party

    min_party = min(d, key=d.get)    # Find key having minimum votes.
    del d[min_party]                 # Delete it.
于 2012-11-27T00:46:39.420 回答
2

@FMc 所说的,除了您正在根据最小值测试不平等而不是测试平等。换句话说,你想要:

if d[key] == min(d.values()):
    del d[key]
    total_votes = sum(d.values())

(注意 == 而不是 !=)

于 2012-11-27T00:58:49.513 回答
1

您的问题已得到解答,但我认为这是一个有趣的问题,所以这是我的解决方案。

def findmajority(votes):
  major = max(votes, key=votes.get)
  if sum([v for k,v in votes.iteritems() if k != major]) < votes[major]:
    return major    
  del votes[min(votes, key=votes.get)]
  return findmajority(votes)

>>> votes = {'a': 10, 'b': 9, 'c':4}
>>> findmajority(votes)
'a'

有几点需要考虑:

  • 它不会规范关系,并将返回一个获胜者,而不是全部。
  • 它将修改您现有的votes结构。您可以通过在传递给函数时复制 dict 或在每次递归时创建新 dict 来解决此问题。
于 2012-11-27T02:37:21.913 回答