Python 如何正确地删除字典中的元素,直到保留一个字符串
我真的需要帮助Python 如何正确地删除字典中的元素,直到保留一个字符串,python,dictionary,Python,Dictionary,我真的需要帮助 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
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)您当前的代码统计每个候选人在列表中排名第一的次数。它不会“消灭”任何人,它只是给人这样做的表象,因为你的一位候选人没有获得第一名的选票 我建议递归地做。你的基本情况是“候选人获得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)
我的解决方案—一步到位:
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())]
这并不奇怪,但很简单:-)您正在尝试实现吗?您的dict包含重复的键<代码>第三次将实际传递为
{('A','C'):2,('C','A'):1}
这些不是重复的。。。因为它们基本上都是在字典中编辑的,直到最后,我终于可以显示输出了