我是编程新手,现在我正在用python编写一个排行榜.我想以第一分排序我的联赛,如果有两支球队有相同的分数,我想根据球门差异对他们进行排序,如果他们有相同的净胜球,我想按名字排序.
第一个条件非常简单,并且工作如下:
table.sort(reverse=True, key=Team.getPoints)
Run Code Online (Sandbox Code Playgroud)
如何插入以下两个条件?
mil*_*ose 11
让key函数返回一个元组,其中的项目按优先顺序递减:
table.sort(reverse=True, key=lambda team: (Team.getPoints(team),
Team.getGoalDifference(team),
Team.getName(team))
Run Code Online (Sandbox Code Playgroud)
或者,您可以记住算法101中的一个factoid,并且利用该事实.sort()是一个稳定的排序,因此如果它们相等,则不会更改列表中项目的相对顺序.这意味着您可以按优先级递增顺序排序三次:
table.sort(reverse=True, key=Team.getName)
table.sort(reverse=True, key=Team.getGoalDifference)
table.sort(reverse=True, key=Team.getPoints)
Run Code Online (Sandbox Code Playgroud)
这将更慢,但允许您轻松指定是否应该执行每个步骤reverse.这可以在没有使用多个排序过程的情况下完成cmp_to_key(),但比较器函数将是非常重要的,例如:
def team_cmp(t1, t2):
for key_func, reverse in [(Team.getName, True),
(Team.getGoalDifference, True),
(Team.getPoints, True)]:
result = cmp(key_func(t1), key_func(t2))
if reverse: result = -result;
if result: return result
return 0
table.sort(functools.cmp_to_key(team_cmp))
Run Code Online (Sandbox Code Playgroud)
(免责声明:以上内容是从记忆中编写的,未经测试.)重点是"没有多次通过",这并不一定意味着"更快".比较器函数的开销和cmp_to_key()两者都是用Python实现的(相对于list.sort()和operator.itemgetter()应该是C核的一部分)可能很重要.
顺便说一句,您不需要创建虚函数来传递key参数.您可以使用以下方法直接访问该属性:
table.sort(key=lambda t: t.points)
Run Code Online (Sandbox Code Playgroud)
或attrgetter运算符包装器:
table.sort(key=attrgetter('points'))
Run Code Online (Sandbox Code Playgroud)