python - 在python中按多个条件排序

标签 python sorting

我是编程新手,现在我正在用 Python 编写联赛表。我想按第一积分对我的联赛进行排序,如果有两支积分相同的球队,我想按净胜球对他们进行排序,如果他们有相同的净胜球,我想按名称排序。

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

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

如何插入以下两个条件?

最佳答案

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

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

或者,您可以记住算法 101 中的一个事实,并利用 .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))

(免责声明:以上是凭内存写的,未经测试。)重点是“没有多次通过”,并不一定意味着“更快”。比较器函数和 cmp_to_key() 的开销,两者都是用 Python 实现的(与 list.sort()operator.itemgetter() 相对) ,这应该是 C 核心的一部分)很可能很重要。

顺便说一句,您不需要创建虚拟函数来传递给 key 参数。您可以使用以下方法直接访问该属性:

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

attrgetter运算符包装器:

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

关于python - 在python中按多个条件排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14299448/

相关文章:

r - 按顺序重组 R 中的向量

python - 我将如何解压缩一个平面列表?

Python 向外键属性插入值(MYSQL)

python pubsub 订阅多个主题

algorithm - 如何计算包含一组字符的所有可能组合的排序列表中字符串值的索引?

sorting - 如何对元素类型是字符串别名而不是字符串本身的 Go slice 进行排序?

arrays - 对可变长度项目/算法进行排序

c++ - 在 C++ 中排序不匹配 'operator+'

python - 使用 python 2.7 的 Django 中的类型错误

python - PyQt Paint 自定义日期格式