有key
函数返回一个元组,其中项目按优先级降序排列:
table.sort(reverse=True, key=lambda team: (Team.getPoints(team),
Team.getGoalDifference(team),
Team.getName(team))
或者,您可以记住算法 101 中的一个事实,并利用这个事实.sort()
is a stable排序,因此如果列表中项目比较相等,则不会更改它们的相对顺序。这意味着您可以按优先级升序排序三次:
table.sort(reverse=True, key=Team.getName)
table.sort(reverse=True, key=Team.getGoalDifference)
table.sort(reverse=True, key=Team.getPoints)
这会比较慢,但可以让您轻松指定每个步骤是否应该在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))
(免责声明:以上内容是凭记忆写的,未经测试。)强调的是“无需多次通过”,这并不一定意味着“更快”。比较器函数的开销和cmp_to_key()
,两者都是用 Python 实现的(而不是list.sort()
and operator.itemgetter()
,它应该是 C 核心的一部分)可能很重要。
顺便说一句,您不需要创建虚拟函数来传递给key
参数。您可以使用以下方法直接访问该属性:
table.sort(key=lambda t: t.points)
or the attrgetter运算符包装器:
table.sort(key=attrgetter('points'))