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]
```

Licensed under: CC-BY-SA with attribution

Not affiliated with: Stack Overflow