2012-11-27 161 views
1

我正在写一个功能来选择一个基于大多数系统的赢家。如果没有多数票,那么我需要用最少的选票取消选择,继续前进,直到获得大多数选票为止。例如,Python - 迭代字典并更改字典 - 如何?

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] 

我试着做一些小的变化,但我要么得到该迭代过程中改变大小的词典,或功能停止工作的错误。

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

+0

如果'('a','b','c','d'):12'表示“得到12票”,那么其余的字母就显得多余了。确实在你的代码中,你把它们扔掉了。我可以看到这正在发展成一个“可转移的投票”系统,但就目前而言,你应该从你的问题中删除这样的细节。 –

+0

这并不能完全解决您的问题,但是通过选择票数最多的候选人不能得到相同的结果吗?我不认为迭代字典是必要的吗? –

+0

你说得对,我应该编辑这部分,现在修复! – user52610

回答

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. 
+0

你是对的,修好了,谢谢。它仍然会改变迭代期间的字典,虽然... – user52610

+0

甚至不知道我可以做到这一点!谢谢,这是有效的 – user52610

2

@FMc说什么,除了你正在测试不平等而不是测试平等。换句话说,你想:

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

(注意==而不是=!)

+0

完成,谢谢,但是这个问题仍然存在 – user52610

+0

也许在更新total_votes后添加一个break语句?这应该会突破d。items()迭代并重新迭代,因为while循环将继续。 – Hexar

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结构。您可以通过在传递给函数时复制字典或在每次递归上创建新字典来解决此问题。