我有一个类似于this问题的自定义排序功能。但是,我有一个列表值 - 如果存在 - 必须排序到列表的末尾(到最后一个位置)。这可以在自定义排序函数中实现吗?
我考虑过以下事项:
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
注意:我想尽可能地限制我的实现此修复程序的范围 - 如果可能的话,仅限于此自定义排序功能。我知道我可以删除这个关键值,执行排序,然后重新添加临界值。但是,这是遗留代码并且已经相当混乱 - 直接在自定义排序功能中实现修复将操作范围之外的影响保持在最低限度。我希望最大限度地提高可读性并尽量减少干扰。
答案 0 :(得分:2)
创建关键功能,而不是创建比较器功能:
mylist.sort(key=lambda i: (i.key == CRITICAL_VALUE, i.key, i.name))
这清楚地表明(至少对我来说)您首先按i.key == CRITICAL_VALUE
排序,然后按i.key
排序,最后按i.name
排序。