我对蟒蛇很陌生。我正在重新考虑我的这个问题方法:
LeagueTable类跟踪一个联盟中每个球员的得分。每场比赛结束后,玩家用record_result函数记录他们的分数。球员在联盟中的排名是按照以下逻辑计算的
实现返回给定级别的播放器的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“。
我有一个解决方案,但我想知道是否有一个更优化的方法来解决这个问题。
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))发布于 2017-11-07 11:41:08
首先,你的整个def player_rank:是过度设计的..。有了正确的标准模块,这实际上就成了一个一条龙。
c这样的名字,x是没有意义的。我根本不知道他们在做什么。sort(),这大大降低了复杂性。sorted()的全部功能,您可以一次对多个项进行排序。-,您可以反转订单,这使得在不同订单上排序多个项目变得更加容易。通过我的更改,我得到了以下代码。
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]https://codereview.stackexchange.com/questions/179802
复制相似问题