关于排序:Python – 如何使用’短路’值(或标志)创建自定义(列表)排序函数

Python - How to make a custom (list) sort function with a 'short circuit' value (or flag)

我有一个类似于这个问题的自定义排序函数。但是,我有一个列表值,如果存在,它必须排序到列表的末尾(最后一个位置)。这可以在自定义排序函数中实现吗?

我考虑过以下几点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mylist.sort(cust_sort)

def cust_sort(item1, item2):
    if item1.key == critical_value:
        #If the item1 in question is the"must be last" item, place it last.
        return -99
        #There should never be more than 99 items in this list, but
        #   this number could be as large as necessary.
    if item1.key > item2.key:
        return 1
    elif item1.key < item2.key:
        return -1
    if item1.name > item2.name:
        return 0

    return 0

注意:我想尽可能地限制这个修复的实现范围——如果可能的话,只限于这个自定义排序函数。我知道我可以删除这个临界值,执行排序,然后重新添加临界值。但是,这是遗留的代码,而且已经非常令人困惑了——直接在自定义排序函数中实现修复可以将操作范围之外的影响降到最低。我更喜欢最大化可读性和最小化干扰。


不要创建比较器函数,而是创建一个键函数:

1
mylist.sort(key=lambda i: (i.key == CRITICAL_VALUE, i.key, i.name))

这就清楚了(至少对我来说)你首先按i.key == CRITICAL_VALUE排序,然后按i.key排序,最后按i.name排序。