I often do sorts in Python using lambda expressions, and although it works fine, I find it not very readable, and was hoping there might be a better way. Here is a typical use case for me.
I have a list of numbers, e.g., x = [12, 101, 4, 56, ...]
I have a separate list of indices: y = range(len(x))
I want to sort y
based on the values in x
, and I do this:
y.sort(key=lambda a: x[a])
Is there a good way to do this without using lambda?
You can use the
__getitem__
method of the list x. This behaves the same as your lambda and will be much faster since it is implemented as a C function instead of a python function:Not elegantly, but:
BTW, you can do this without creating a separate list of indices:
I suppose if I wanted to create another function, I could do it something like this (not tested):
Though I think I prefer to use lambda instead to avoid having to create an extra function.
I'm not sure if this is the kind of alternative you meant, but you could define the key function with a
def
:Personally, I think this is worse than the
lambda
as it moves the sort criteria away from the line of code doing the sort and it needlessly adds thesort_key
function into your namespace.