在Python中使用自定义比较函数对列表进行sorting

我知道有几个这样的问题,但我似乎无法得到他们的工作答案。

我有一份清单,五十五个元素。 现在我想通过对每个元素应用自定义比较函数来对这个列表进行sorting。 这个函数计算元素sorting的列表的适应度。 我创造了两个function,比较和健身:

def compare(item1, item2): return (fitness(item1) < fitness(item2)) 

 def fitness(item): return item[0]+item[1]+item[2]+item[3]+item[4] 

然后我试着打电话给他们:

 sorted(mylist, cmp=compare) 

要么

 sorted(mylist, key=fitness) 

要么

 sorted(mylist, cmp=compare, key=fitness) 

要么

 sorted(mylist, cmp=lambda x,y: compare(x,y)) 

我也试着用相同的参数list.sort()。 但是在任何情况下,这些函数都不会得到一个列表作为参数,而是一个None 。 我不知道这是为什么,大多来自C + +这与我的任何callback函数的想法相矛盾。 我怎样才能sorting这个列表与自定义函数?

编辑我发现我的错误。 在创build原始列表的链中,一个函数不返回任何内容,但返回值被使用。 对不起,麻烦了

 >>> l = [list(range(i, i+4)) for i in range(10,1,-1)] >>> l [[10, 11, 12, 13], [9, 10, 11, 12], [8, 9, 10, 11], [7, 8, 9, 10], [6, 7, 8, 9], [5, 6, 7, 8], [4, 5, 6, 7], [3, 4, 5, 6], [2, 3, 4, 5]] >>> sorted(l, key=sum) [[2, 3, 4, 5], [3, 4, 5, 6], [4, 5, 6, 7], [5, 6, 7, 8], [6, 7, 8, 9], [7, 8, 9, 10], [8, 9, 10, 11], [9, 10, 11, 12], [10, 11, 12, 13]] 

以上的作品。 你在做一些不同的事情吗?

注意你的关键函数只是sum ; 没有必要明确地写出来。

另外,你的比较function是不正确的。 它需要返回-1,0或1,而不是布尔值。 正确的比较function是:

 def compare(item1, item2): if fitness(item1) < fitness(item2): return -1 elif fitness(item1) > fitness(item2): return 1 else: return 0 

您需要稍微修改您的compare函数,并使用functools.cmp_to_key将其传递到sorted 。 示例代码:

 import functools lst = [list(range(i, i+5)) for i in range(5, 1, -1)] def fitness(item): return item[0]+item[1]+item[2]+item[3]+item[4] def compare(item1, item2): return fitness(item1) - fitness(item2) sorted(lst, key=functools.cmp_to_key(compare)) 

输出:

 [[2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8], [5, 6, 7, 8, 9]] 

工作:)