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 argsort
implementação
Se você tiver o NumPy à sua disposição, poderá simplesmente usar a função numpy.argsort
ou 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 argsort
a 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 é
1
e está no índice 1
do original, portanto, o primeiro elemento do resultado é 1
.
- O
2
está no índice 2
no original, portanto, o segundo elemento do resultado é 2
.
- O
3
está no índice 0
no original, portanto, o terceiro elemento do resultado está 0
.
- O maior valor
4
e está no índice 3
no 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 2
na matriz / lista classificada, portanto, o primeiro elemento 2
.
- o segundo elemento do original é
1
, que é o menor valor, portanto, ele teria um índice 0
na 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 1
na matriz / lista classificada, de modo que o terceiro elemento é 1
.
- o quarto elemento do original é
4
qual é o maior valor, portanto, ele teria um índice 3
na matriz / lista classificada, e o último elemento 3
.