python中的多条件排序

python中的多条件排序,python,sorting,Python,Sorting,我是编程新手,现在我正在用python编写一个排行榜。我想按照第一个积分对我的联赛进行排序,如果有两支球队拥有相同的积分,我想按照进球差异对他们进行排序,如果他们有相同的进球差异,我想按照名字进行排序 第一个条件非常简单,可通过以下方式实现: table.sort(reverse=True, key=Team.getPoints) 如何插入以下两个条件?首先按名称对列表排序,然后再按分数差排序。Python的sort是稳定的,这意味着它将保留比较相等的元素的顺序。让键函数返回一个元组,其中的项

我是编程新手,现在我正在用python编写一个排行榜。我想按照第一个积分对我的联赛进行排序,如果有两支球队拥有相同的积分,我想按照进球差异对他们进行排序,如果他们有相同的进球差异,我想按照名字进行排序

第一个条件非常简单,可通过以下方式实现:

table.sort(reverse=True, key=Team.getPoints)

如何插入以下两个条件?

首先按名称对列表排序,然后再按分数差排序。Python的
sort
是稳定的,这意味着它将保留比较相等的元素的顺序。

函数返回一个元组,其中的项按优先级的降序排列:

table.sort(reverse=True, key=lambda team: (Team.getPoints(team),
                                           Team.getGoalDifference(team),
                                           Team.getName(team))
table.sort(reverse=True, key=Team.getName)
table.sort(reverse=True, key=Team.getGoalDifference)
table.sort(reverse=True, key=Team.getPoints)
或者,您可以记住算法101中的factoid,并利用
.sort()
稳定的排序这一事实,因此,如果列表中的项比较相等,则不会更改它们的相对顺序。这意味着您可以按优先级的增加顺序进行三次排序:

table.sort(reverse=True, key=lambda team: (Team.getPoints(team),
                                           Team.getGoalDifference(team),
                                           Team.getName(team))
table.sort(reverse=True, key=Team.getName)
table.sort(reverse=True, key=Team.getGoalDifference)
table.sort(reverse=True, key=Team.getPoints)
这将更慢,但允许您轻松指定是否应在
反向中执行每个步骤。使用
cmp\u to\u 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))
(免责声明:以上内容是从内存中编写的,未经测试。)重点是“无需多次通过”,这并不一定意味着“更快”。comparator函数和
cmp\u to_key()
的开销可能很大,这两个函数都是用Python实现的(而不是
list.sort()
operator.itemgetter()
,它们应该是C核心的一部分)

另外,您不需要创建伪函数来传递给
参数。您可以使用以下命令直接访问该属性:

table.sort(key=lambda t: t.points)
或运算符包装器:

table.sort(key=attrgetter('points'))

正如ACEfanatic02所指出的,Python排序算法意味着顺序被保留。对其工作原理有很好的视觉解释。

您可能想阅读。(事实上,我现在很难加载它,但总是)哇。我有完全相同的任务:对联盟中的球队进行排序)第一个球队和第二个球队是否有点不同?它将
reverse=True
应用于整个元组,而三步版本仅将其应用于点。@DSM是的,我试图举例说明可以更改各个步骤的顺序,但我想这并不明显,也不容易混淆。嗯,难道你不能用
*-1
来反转一个字段吗?@SnakesandCoffee如果它是一个字符串呢?函数名似乎暗示它们是数字(除了
getName
),因此蒂姆·彼得斯成为了不朽的人物。