Question
Asked By – DaClown
I know there are several questions named like this, but they don’t seem to work for me.
I have a list of lists, 50 times 5 elements. I want to sort this list by applying a custom compare function to each element. This function calculates the fitness of the list by which the elements shall be sorted. I created two functions, compare and fitness:
def compare(item1, item2):
return (fitness(item1) < fitness(item2))
and
def fitness(item):
return item[0]+item[1]+item[2]+item[3]+item[4]
Then I tried to call them by:
sorted(mylist, cmp=compare)
or
sorted(mylist, key=fitness)
or
sorted(mylist, cmp=compare, key=fitness)
or
sorted(mylist, cmp=lambda x,y: compare(x,y))
Also I tried list.sort() with the same parameters. But in any case the functions don’t get a list as an argument but a None
. I have no idea why that is, coming from mostly C++ this contradicts any idea of a callback function for me. How can I sort this lists with a custom function?
Edit
I found my mistake. In the chain that creates the original list one function didn’t return anything but the return value was used. Sorry for the bother
Now we will see solution for issue: Sort a list of lists with a custom compare function
Answer
>>> 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]]
The above works. Are you doing something different?
Notice that your key function is just sum
; there’s no need to write it explicitly.
This question is answered By – Katriel
This answer is collected from stackoverflow and reviewed by FixPython community admins, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0