0

これについて本当に助けが必要です

def get_winner (dict_winner):
    new_dict = {} 
    for winner in dict_winner:
        first_letter = winner[0]
        value = dict_winner[winner]
        if first_letter in new_dict:
            new_dict[first_letter] += value
        else:
            new_dict[first_letter] = value
    return (new_dict)


get_winner({
    ('C', 'A', 'B', 'D') :3,
    ('D', 'B', 'C', 'A') :2,
    ('C', 'D', 'A', 'B') :1,
    ('A', 'D', 'B', 'C') :2,
    ('A', 'D', 'C', 'B') :4, 
    ('A', 'C', 'D', 'B') :2
})

#Outputs {'A': 8, 'D': 2, 'C': 4}

今、結果を str のタプル、NoneType..

また、一番小さい値の文字だけを1回だけ消しています。最終的に1人の勝者が得られるまで、このプロセスを繰り返してほしい. したがって、この場合、出力ではなく、辞書自体ですべての B が削除されます。例えば:

first time = [8, 0, 4, 2] 
second time = {
    ('C', 'A', 'D') :3, 
    ('D', 'C', 'A') :2,
    ('C', 'D', 'A') :1,
    ('A', 'D', 'C') :2,
    ('A', 'D', 'C') :4,
    ('A', 'C', 'D') :2
}) 
#Outputs C = 4 D = 2 A = 8 

third time= {
    ('C', 'A') :3, 
    ('C', 'A') :2, 
    ('C', 'A') :1, 
    ('A', 'C') :2, 
    ('A', 'C') :4,
    ('A', 'C') :2
}) 
#Outputs C = 6 A = 8

8/14 > 50%、私はそれが最初から当てはまるべきだったことを知ってAいます。しかし、私はA除去が開始されるべきときである 40% の値を持っていると仮定しています. では、これをコーディングする際にどこが間違っていたのか指摘していただけますか? 例Aでは勝者でなければなりません!したがって、出力は ('A', None) になります。

4

2 に答える 2

0

現在のコードは、各候補がリストの最初にある回数をカウントします。誰かを「排除」するわけではありません。候補者の 1 人が 1 位の票を獲得していないため、そうしているように見えるだけです。

再帰的に行うことをお勧めします。あなたの基本的なケースは、「候補者が投票の 50% を超える」です。このようなもの:

def get_winner(vote_dict)
    total_votes = sum(vote_dict.values())
    votes_by_candidate = defaultdict(int)    # This makes your if/else block redundant

    for vote_pattern in vote_dict:
        votes_by_candidate[vote_pattern[0]] += vote_dict[vote_pattern]

    for candidate in votes_by_candidate:
         if votes_by_candidate[candidate] * 2 > total_votes:
             return candidate

    new_dict = defaultdict(int)
    eliminated = min(votes_by_candidate, key=votes_by_candidate.get)

    for vote_pattern in vote_dict:
        new_pattern = [candidate for candidate in vote_pattern if candidate != eliminated]
        new_dict[new_pattern] += vote_dict[vote_pattern]

    return get_winner(new_dict)
于 2012-11-26T16:54:12.000 に答える
0

私の解決策 - ワンステップで:

def get_winner(candidates):
    winners = dict.fromkeys(map(lambda f: f[0] for f in candidates.keys()))
    for cand, votes in candidates.iteritems(): 
        winners[cand[0]]+=votes
    return [winner for winner, vote in winners.iteritems() if vote ==max(winners.values())]

派手ではありませんが、シンプルです:-)

于 2012-11-27T16:10:22.443 に答える