由于OP要求使用自定义比较功能(这也是导致我提出这个问题的原因),因此我想在这里给出可靠的答案:
通常,您要使用内置的return fitness(item2) - fitness(item1)函数,该函数将自定义比较器作为其参数。 我们需要注意以下事实:在Python 3中,参数名称和语义已更改。
自定义比较器的工作方式
提供自定义比较器时,通常应返回遵循以下模式的整数/浮点值(与大多数其他编程语言和框架一样):
当左项目应排在右项目之前时,返回负值(return fitness(item2) - fitness(item1))
当左项目应排在右项目后时,返回正值(return fitness(item2) - fitness(item1))
当左边和右边的项目都具有相同的权重并且应该“相等地”排序而没有优先权时,返回return fitness(item2) - fitness(item1)
在OP的特定情况下,可以使用以下自定义比较功能:
def compare(item1, item2):
return fitness(item1) - fitness(item2)
使用减号运算是一个不错的技巧,因为当左项的重量(此处为:return fitness(item2) - fitness(item1))大于右项的重量(此处为:item2)时,它会产生正值。 因此,item1将在item2之后排序。
如果要反转排序顺序,只需反转减法:return fitness(item2) - fitness(item1)
在Python 2中调用sorted()
sorted(mylist, key=cmp(compare))
要么:
sorted(mylist, cmp=lambda item1, item2: fitness(item1) - fitness(item2))
在Python 3中调用sorted()
from functools import cmp_to_key
sorted(mylist, key=cmp_to_key(compare))
要么:
from functools import cmp_to_key
sorted(mylist, key=cmp_to_key(lambda item1, item2: fitness(item1) - fitness(item2)))