Python - 如何使用 'short circuit' 值(或标志)创建自定义(列表)排序函数
Python - How to make a custom (list) sort function with a 'short circuit' value (or flag)
我有一个类似于 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
注意:我想尽可能地限制我实施此修复程序的范围 - 如果可能,仅限此自定义排序功能。我知道我可以删除这个临界值,执行排序,然后重新添加临界值。但是,这是遗留代码并且已经相当混乱 - 直接在自定义排序函数中实施修复可将操作范围之外的影响降至最低。我更愿意最大化可读性和最小化干扰。
不创建比较器函数,而是创建键函数:
mylist.sort(key=lambda i: (i.key == CRITICAL_VALUE, i.key, i.name))
这清楚地表明(至少对我而言)您首先按 i.key == CRITICAL_VALUE
排序,然后按 i.key
,最后按 i.name
。
我有一个类似于 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
注意:我想尽可能地限制我实施此修复程序的范围 - 如果可能,仅限此自定义排序功能。我知道我可以删除这个临界值,执行排序,然后重新添加临界值。但是,这是遗留代码并且已经相当混乱 - 直接在自定义排序函数中实施修复可将操作范围之外的影响降至最低。我更愿意最大化可读性和最小化干扰。
不创建比较器函数,而是创建键函数:
mylist.sort(key=lambda i: (i.key == CRITICAL_VALUE, i.key, i.name))
这清楚地表明(至少对我而言)您首先按 i.key == CRITICAL_VALUE
排序,然后按 i.key
,最后按 i.name
。