【发布时间】:2019-03-09 08:02:06
【问题描述】:
我遇到了如下问题,需要在 Python 中执行:
LeagueTable 类跟踪联盟中每个玩家的得分。每场比赛结束后,玩家使用 record_result 函数记录他们的得分。
玩家在联赛中的排名使用以下逻辑计算:
1.得分最高的玩家排名第一(排名1)。得分最低的玩家排名最后。
2.如果两名玩家得分相同,则出场次数最少的玩家排名较高。
3.如果两名球员的得分和比赛次数相同,那么在球员名单中排名第一的球员排名更高。
实现 player_rank 函数,返回给定排名的玩家。
from collections import Counter
from collections import OrderedDict
class LeagueTable:
def __init__(self, players):
self.standings = OrderedDict([(player, Counter()) for player in players])
def record_result(self, player, score):
self.standings[player]['games_played'] += 1
self.standings[player]['score'] += score
def player_rank(self, rank):
return None
table = LeagueTable(['Mike', 'Chris', 'Arnold'])
table.record_result('Mike', 2)
table.record_result('Mike', 3)
table.record_result('Arnold', 5)
table.record_result('Chris', 5)
print(table.player_rank(1))
我为它写了一个超过 20 行的长解决方案,但后来我发现了一个更短的函数代码,如下所示:
def player_rank(self, rank):
print(self.standings)
ranking = sorted(self.standings, key=lambda p: (
-self.standings[p]['score'], self.standings[p]['games_played'], self.standings[p]['pos']))
return ranking[rank - 1]
有人可以帮我理解它是如何工作的吗?
P.S:我只是一个新手,开始学习编程。
原始问题的链接。
【问题讨论】:
标签: python python-2.7 sorting lambda