I need to sort a list and then return a list with the index of the sorted items in the list. For example, if the list I want to sort is
[2,3,1,4,5], I need
[2,0,1,3,4] to be returned.
This question was posted on bytes, but I thought I would repost it here. http://bytes.com/topic/python/answers/44513-sorting-list-then-return-index-sorted-item
My specific need to sort a list of objects based on a property of the objects. I then need to re-order a corresponding list to match the order of the newly sorted list.
Is there a good way to do this?
You can use the python sorting functions'
key parameter to sort the index array instead.
>>> s = [2, 3, 1, 4, 5] >>> sorted(range(len(s)), key=lambda k: s[k]) [2, 0, 1, 3, 4] >>>
You can do this with numpy's argsort method if you have numpy available:
>>> import numpy >>> vals = numpy.array([2,3,1,4,5]) >>> vals array([2, 3, 1, 4, 5]) >>> sort_index = numpy.argsort(vals) >>> sort_index array([2, 0, 1, 3, 4])
If not available, taken from this question, this is the fastest method:
>>> vals = [2,3,1,4,5] >>> sorted(range(len(vals)), key=vals.__getitem__) [2, 0, 1, 3, 4]