python中的多条件排序

2024-10-17 06:25:38 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

如何插入以下两个条件?


Tags: keytrue排序编程方式table条件名字
3条回答

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

Python排序算法是Timsort,正如acefanic02所指出的,它是stable,这意味着顺序被保留。This link对它的工作原理有很好的视觉解释。

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

table.sort(reverse=True, key=lambda team: (Team.getPoints(team),
                                           Team.getGoalDifference(team),
                                           Team.getName(team))

或者,您可以记住算法101中的factoid,并利用事实.sort()是一个稳定的排序,因此如果它们比较为相等,则不会更改列表中项目的相对顺序。这意味着您可以按优先级递增的顺序进行三次排序:

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))

(免责声明:以上是从内存写的,未经测试)强调的是“没有多次通过”,这并不一定意味着“更快”。comparator函数和cmp_to_key()的开销可能很大,这两个函数都是用Python实现的(而list.sort()operator.itemgetter()应该是C核心的一部分)。

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

table.sort(key=lambda t: t.points)

或者^{}运算符包装:

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

相关问题 更多 >