I have a numerical list:
myList = [1, 2, 3, 100, 5]
Now if I sort this list to obtain [1, 2, 3, 5, 100]
.
What I want is the indices of the elements from the
original list in the sorted order i.e. [0, 1, 2, 4, 3]
--- ala MATLAB's sort function that returns both
values and indices.
If you do not want to use numpy,
is fastest, as demonstrated here.
If you are using numpy, you have the argsort() function available:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.argsort.html
This returns the arguments that would sort the array or list.
Warning, pros only:
Something like next:
enumerate(myList)
gives you a list containing tuples of (index, value):You sort the list by passing it to
sorted
and specifying a function to extract the sort key (the second element of each tuple; that's what thelambda
is for. Finally, the original index of each sorted element is extracted using the[i[0] for i in ...]
list comprehension.Updated answer with
enumerate
anditemgetter
:Zip the lists together: The first element in the tuple will the index, the second is the value (then sort it using the second value of the tuple
x[1]
, x is the tuple)Or using
itemgetter
from theoperator
module`:The answers with
enumerate
are nice, but I personally don't like the lambda used to sort by the value. The following just reverses the index and the value, and sorts that. So it'll first sort by value, then by index.