Recuperando a permutação usada para (des) classificar uma lista

Neste protocolo, apresento um truque para classificar uma lista e, simultaneamente, calcular a permutação mapeando a posição de um elemento na lista classificada para sua posição na lista original.

Este é o truque em Python, embora a ideia possa ser implementada na linguagem de sua escolha:

>>> l = [ random.randint(1,1000) for _ in xrange(5) ]; l
[591, 760, 940, 764, 391]
>>> L = [ (l[i],i) for i in xrange(len(l)) ]
>>> L.sort()
>>> sorted_l,permutation = zip(*L)
>>> sorted_l
(391, 591, 760, 764, 940)
>>> permutation
(4, 0, 1, 3, 2)

Normalmente, isso é útil quando informações adicionais relacionadas à chave são acessadas por meio do índice da chave na lista original.

Aproveitar!