Essencialmente, você precisa fazer um argsort, de qual implementação você depende depende se você deseja usar bibliotecas externas (por exemplo, NumPy) ou se deseja permanecer em Python puro sem dependências.
A pergunta que você precisa se perguntar é: você quer o
- índices que ordenariam a matriz / lista
- índices que os elementos teriam na lista / matriz classificada
Infelizmente, o exemplo da pergunta não deixa claro o que é desejado, porque ambos darão o mesmo resultado:
>>> arr = np.array([1, 2, 3, 100, 5])
>>> np.argsort(np.argsort(arr))
array([0, 1, 2, 4, 3], dtype=int64)
>>> np.argsort(arr)
array([0, 1, 2, 4, 3], dtype=int64)
Escolhendo a argsortimplementação
Se você tiver o NumPy à sua disposição, poderá simplesmente usar a função numpy.argsortou método numpy.ndarray.argsort.
Uma implementação sem NumPy já foi mencionada em algumas outras respostas, portanto, apenas recapitularei a solução mais rápida de acordo com a resposta de referência aqui
def argsort(l):
return sorted(range(len(l)), key=l.__getitem__)
Obtendo os índices que ordenariam a matriz / lista
Para obter os índices que ordenariam a matriz / lista, você pode simplesmente chamar argsorta matriz ou a lista. Estou usando as versões do NumPy aqui, mas a implementação do Python deve fornecer os mesmos resultados
>>> arr = np.array([3, 1, 2, 4])
>>> np.argsort(arr)
array([1, 2, 0, 3], dtype=int64)
O resultado contém os índices necessários para obter a matriz classificada.
Como a matriz classificada seria, [1, 2, 3, 4]a matriz argsorted contém os índices desses elementos no original.
- O menor valor é
1e está no índice 1do original, portanto, o primeiro elemento do resultado é 1.
- O
2está no índice 2no original, portanto, o segundo elemento do resultado é 2.
- O
3está no índice 0no original, portanto, o terceiro elemento do resultado está 0.
- O maior valor
4e está no índice 3no original, portanto, o último elemento do resultado é 3.
Obtendo os índices que os elementos teriam na matriz / lista classificada
Nesse caso, você precisaria aplicar argsort duas vezes :
>>> arr = np.array([3, 1, 2, 4])
>>> np.argsort(np.argsort(arr))
array([2, 0, 1, 3], dtype=int64)
Nesse caso :
- o primeiro elemento do original é
3, que é o terceiro maior valor, portanto, ele teria um índice 2na matriz / lista classificada, portanto, o primeiro elemento 2.
- o segundo elemento do original é
1, que é o menor valor, portanto, ele teria um índice 0na matriz / lista classificada, de modo que o segundo elemento é 0.
- o terceiro elemento do original é
2, que é o segundo menor valor; portanto, ele teria um índice 1na matriz / lista classificada, de modo que o terceiro elemento é 1.
- o quarto elemento do original é
4qual é o maior valor, portanto, ele teria um índice 3na matriz / lista classificada, e o último elemento 3.