【问题标题】:TestDome League table - PythonTestDome 排行榜 - Python
【发布时间】: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:我只是一个新手,开始学习编程。

原始问题的链接。

https://www.testdome.com/d/python-interview-questions/9

【问题讨论】:

    标签: python python-2.7 sorting lambda


    【解决方案1】:

    解决方案:

    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]
    

    整个功能基本上是根据key对玩家进行排序,First

    -self.standing[p]['score']
    

    根据'score'得到降序列表,即从最高到最低,然后

    self.standings[p]['games_played']
    

    根据 'games_played' 将之前的列表重新排序为升序

    self.standings[p]['pos']
    

    这应该是根据有序集合的顺序对列表进行排序,我想你错过了代码的其他部分与 'pos'

    现在你有一个排序了所有排名的列表,你返回具有特定排名的特定玩家

    【讨论】:

      【解决方案2】:

      截至 2019 年,该问题已通过 4 个测试用例。

          def player_rank(self, rank):
          srt = sorted(
              self.standings.items(),
              key=lambda kv: (
                    -kv[1]['score'],
                    kv[1]['games_played'],
              ),
              reverse=False)
      
          # print(srt)
          return srt[rank - 1][0]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-14
        • 1970-01-01
        • 1970-01-01
        • 2021-09-03
        • 2010-12-31
        相关资源
        最近更新 更多