<p>让<code>key</code>函数返回一个元组,其中的项按优先级的降序排列:</p>
<pre><code>table.sort(reverse=True, key=lambda team: (Team.getPoints(team),
Team.getGoalDifference(team),
Team.getName(team))
</code></pre>
<p>或者,您可以记住算法101中的factoid,并利用事实<code>.sort()</code>是一个<strong>稳定的</strong>排序,因此如果它们比较为相等,则不会更改列表中项目的相对顺序。这意味着您可以按优先级递增的顺序进行三次排序:</p>
<pre><code>table.sort(reverse=True, key=Team.getName)
table.sort(reverse=True, key=Team.getGoalDifference)
table.sort(reverse=True, key=Team.getPoints)
</code></pre>
<p>这将比较慢,但允许您轻松指定是否应在<code>reverse</code>中完成每个步骤。不需要使用<code>cmp_to_key()</code>进行多次排序就可以完成,但是比较器函数将是非常重要的,比如:</p>
<pre><code>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))
</code></pre>
<p>(免责声明:以上是从内存写的,未经测试)强调的是“没有多次通过”,这并不一定意味着“更快”。comparator函数和<code>cmp_to_key()</code>的开销可能很大,这两个函数都是用Python实现的(而<code>list.sort()</code>和<code>operator.itemgetter()</code>应该是C核心的一部分)。</p>
<p>另外,不需要创建伪函数来传递给<code>key</code>参数。可以使用以下命令直接访问属性:</p>
<pre><code>table.sort(key=lambda t: t.points)
</code></pre>
<p>或者<a href="http://docs.python.org/2/library/operator.html#operator.attrgetter" rel="noreferrer">^{<cd9>}</a>运算符包装:</p>
<pre><code>table.sort(key=attrgetter('points'))
</code></pre>