我们在两级词典中代表一系列匹配的击球手,如下所示:
compile
每个比赛由一个字符串标识,每个玩家也是如此。分数都是整数。与匹配相关联的名称不是固定的(此处为{'match1':{'player1':57, 'player2':38}, 'match2':{'player3':9, 'player1':42}, 'match3':{'player2':41, 'player4':63, 'player3':91}
,match1
,match2
),也不是播放器的名称。玩家不需要在所有比赛中记录得分
定义一个Python函数match3
,它读取此表单的字典d并标识总得分最高的玩家。您的函数应该返回一对orangecap(d)
,其中(playername,topscore)
是一个字符串,得分最高的玩家的名称,playername
是一个整数,总分为topscore
答案 0 :(得分:1)
总结数据并选择最高值通常可以使用collections.Counter()
完成,如下所示:
def orangecap(d):
from collections import Counter
return sum((Counter(game) for game in d.values()), Counter()).most_common(1)[0]
答案 1 :(得分:0)
不如Rob的答案那么漂亮,但不需要任何进口:
def orangecap(d):
first_run = 1
for match in d:
for player in d[match]:
if first_run == 1:
first_run = 0
topscore = d[match][player]
playername = d[match]
elif d[match][player] > topscore:
topscore = d[match][player]
playername = player
return [playername, topscore]
答案 2 :(得分:0)
这是一个有目的(!)冗长而不是特别优雅的解决方案,它只使用相当基本的数据结构,try / except,for循环和条件。对于初学者,我认为这可能更有助于遵循所有步骤的逻辑,即正在发生的事情的方式和原因。我使用了描述性变量名来使其易于理解。如果两个或更多玩家具有相同的总分,则以下代码也将起作用:
game = {'match1': {'player1': 57, 'player2': 38},
'match2': {'player3': 9, 'player1': 42},
'match3': {'player2': 41, 'player4': 63, 'player3': 91},
'match4': {'player1': 1}}
def orangecap(matches):
players_and_scores = {}
top_players_and_scores = []
for match in matches:
for player, score in matches[match].items():
try: # if key already exists
players_and_scores[player] += score
except: # if key does not exist yet
players_and_scores[player] = score
# all players and their total stores:
# print(players_and_scores)
for player, score in players_and_scores.items():
if score == max(players_and_scores.values()):
top_players_and_scores.append((player, score))
# return all top players (can be more than one)
# and their total scores:
return top_players_and_scores
print(orangecap(game))
输出:
[('player3', 100), ('player1', 100)]
注意我将密钥match4
添加到字典中,以便让两个玩家拥有相同的总分。
Robᵩ的解决方案更加简洁和优雅,如果您能够遵循它的功能并且允许使用collections.Counter()
,则建议使用它。但是,它只返回得分最高的一名球员,因此可能需要进行一些调整。