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

此外,它只消除一次仅排在第一位的最小值的字母。我希望它重复这个过程,直到我最终得到一个赢家。所以在这种情况下,所有 B 都将在 dict 本身中被消除,而不是在输出中。例如:

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

您当前的代码计算每个候选人在列表中排名第一的次数。它不会“消除”任何人,它只是看起来这样做,因为您的一位候选人没有获得第一名的选票。

我建议递归地做。您的基本情况是“候选人获得超过 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 回答