1

多数決に基づくシステムで勝者を選択する関数を作成しています。過半数がない場合は、投票数が最も少ない選択肢を削除し、投票数が過半数の勝者が出るまで続行する必要があります。例えば、

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

この場合、'a'は 12 票、'b'9票、 'd'4票です。'a'は過半数 (12/25 票) を持っていないため'd'、利用可能な選択肢から削除する必要があり、過半数 (12/21) になります。各「投票」には任意の数の選択肢がありますが、重要なのはそれぞれの番号の 1 つだけです。

私のコードは次の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'

考慮すべき点がいくつかあります。

  • それは引き分けを規制せず、すべてではなく勝者の1人を返します.
  • それはあなたの既存のvotes構造を変更します。関数に渡されたときに辞書のコピーを作成するか、再帰ごとに新しい辞書を作成することで、これを回避できます。
于 2012-11-27T02:37:21.913 に答える