[Tutor] Original indices after Sorting

eryksun eryksun at gmail.com
Tue Jul 24 04:52:19 CEST 2012


On Mon, Jul 23, 2012 at 4:02 PM, Ali Torkamani <torkamani at gmail.com> wrote:
> By the way, I myself, have this solution:
>
>> How can we get the indices of values in the original list after sorting a
>> list?
>>
>
> (Pdb) A=[ 1, -1, 0, 7, 9, 1.3, 2.9 ]
> (Pdb) sorted(zip(A, range(len(A))), key = lambda x: x[0])
> [(-1, 1), (0, 2), (1, 0), (1.3, 5), (2.9, 6), (7, 3), (9, 4)]

Here's a variation:

from operator import itemgetter

def sortix(seq):
    L, B = zip(*sorted(enumerate(seq), key=itemgetter(1)))
    return B, L

Your original result is shaped Nx2. zip(*seq) is a quick way to
transpose that to 2xN. The * operator turns each item into an argument
of zip.

Example:

>>> A = [1, -1, 0, 7, 9, 1.3, 2.9]
>>> B, L = sortix(A)
>>> B
(-1, 0, 1, 1.3, 2.9, 7, 9)
>>> L
(1, 2, 0, 5, 6, 3, 4)

If you need lists, you can use map:

>>> B, L = map(list, sortix(A))
>>> B
[-1, 0, 1, 1.3, 2.9, 7, 9]
>>> L
[1, 2, 0, 5, 6, 3, 4]


More information about the Tutor mailing list