2012-11-27 94 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結構。您可以通過在傳遞給函數時複製字典或在每次遞歸上創建新字典來解決此問題。