首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过对OrderedDict的内容进行排序,对联赛中的球员进行排名

通过对OrderedDict的内容进行排序,对联赛中的球员进行排名
EN

Code Review用户
提问于 2017-11-07 09:55:43
回答 1查看 4.2K关注 0票数 5

我对蟒蛇很陌生。我正在重新考虑我的这个问题方法:

LeagueTable类跟踪一个联盟中每个球员的得分。每场比赛结束后,玩家用record_result函数记录他们的分数。球员在联盟中的排名是按照以下逻辑计算的

  1. 得分最高的选手排名第一(第一名)。得分最低的选手排在最后。
  2. 如果两名球员在得分上打成平局,那么打过最少比赛的球员就会排得更高。
  3. 如果两名球员在得分和比赛次数上打成平局,那么排在第一位的球员就会排得更高。

实现返回给定级别的播放器的player_rank函数。示例表= LeagueTable(“迈克”,“克里斯”,“阿诺德”) table.record_result('Mike',2) table.record_result('Mike',3) table.record_result('Arnold',5) table.record_result('Chris',5)打印(table.player_rank(1))所有球员的得分相同。然而,阿诺德和克里斯的上场次数比迈克少,因为克里斯在阿诺德之前的球员名单上,他排在第一位。因此,上面的代码应该显示"Chris“。

我有一个解决方案,但我想知道是否有一个更优化的方法来解决这个问题。

代码语言:javascript
复制
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'] += int(score)# print(self.standings)# print("")
    def player_rank(self, rank): #res = OrderedDict()
        x=self.standings
        d=self.standings
        def swap_list(xl,co):
            xl[co],xl[co+3]=xl[co+3],xl[co]
            xl[co+1],xl[co+4]=xl[co+4],xl[co+1]
            xl[co+2],xl[co+5]=xl[co+5],xl[co+2]
            return(xl,co)
        
        player_list=[]
        lc=len(x)
        lc1=lc
        lc=lc*3
        for p,c in x.items():
            player_list.append(p)
            player_list.append(c["score"])
            player_list.append(c["games_played"])
        for j in range(lc1):
            for i in range(0,lc-3,3):
                # print(i+4)
                if (player_list[i+1] < player_list[i+4]):
                    swap_list(player_list,i)
                elif (player_list[i+1]==player_list[i+4]):
                    if(player_list[i+2]>player_list[i+5]):
                        swap_list(player_list,i)
                    elif(player_list[i+2]==player_list[i+5]):
                        pass

        return(player_list[(rank-1)*3])
        
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)
rk=int(input("enter rank \n"))
print(table.player_rank(rk))
EN

回答 1

Code Review用户

回答已采纳

发布于 2017-11-07 11:41:08

首先,你的整个def player_rank:是过度设计的..。有了正确的标准模块,这实际上就成了一个一条龙。

评论

  • 使用更好的变量名(命名很难),但是对我来说,像c这样的名字,x是没有意义的。我根本不知道他们在做什么。
  • 使用内置的方法,如sort(),这大大降低了复杂性。
  • 使用sorted()的全部功能,您可以一次对多个项进行排序。
  • 在我们正在排序的项目之前使用一个-,您可以反转订单,这使得在不同订单上排序多个项目变得更加容易。

通过我的更改,我得到了以下代码。

代码语言:javascript
复制
from collections import OrderedDict, Counter

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 sorted(self.standings, key=lambda p: (-self.standings[p]['score'], 
                                                     self.standings[p]['games_played']))[rank-1]
票数 7
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/179802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档