Cómo obtener índices de una matriz ordenada en Python

Tengo una lista numérica:

myList = [1, 2, 3, 100, 5] 

Ahora si ordeno esta lista para obtener [1, 2, 3, 5, 100] . Lo que quiero son los índices de los elementos de la lista original en el orden ordenado, es decir, [0, 1, 2, 4, 3] — ala Función de clasificación de MATLAB que devuelve valores e índices.

Si está usando numpy, tiene la función argsort () disponible:

 >>> import numpy >>> numpy.argsort(myList) array([0, 1, 2, 4, 3]) 

http://docs.scipy.org/doc/numpy/reference/generated/numpy.argsort.html

Esto devuelve los argumentos que clasificarían la matriz o la lista.

Algo como el siguiente:

 >>> myList = [1, 2, 3, 100, 5] >>> [i[0] for i in sorted(enumerate(myList), key=lambda x:x[1])] [0, 1, 2, 4, 3] 

enumerate(myList) le da una lista que contiene tuplas de (índice, valor):

 [(0, 1), (1, 2), (2, 3), (3, 100), (4, 5)] 

Usted ordena la lista pasándola a sorted y especificando una función para extraer la clave de clasificación (el segundo elemento de cada tupla; para eso está la lambda . Finalmente, el índice original de cada elemento clasificado se extrae utilizando la tecla [i[0] for i in ...] lista de comprensión.

Advertencia, solo profesionales:

 myList = [1, 2, 3, 100, 5] sorted(range(len(myList)),key=myList.__getitem__) [0, 1, 2, 4, 3] 

introduzca la descripción de la imagen aquí

Las respuestas con enumerate son buenas, pero personalmente no me gusta la lambda utilizada para ordenar por el valor. Lo siguiente simplemente invierte el índice y el valor, y lo ordena. Así que primero se ordenará por valor, luego por índice.

 sorted((e,i) for i,e in enumerate(myList)) 

Respuesta actualizada con enumerate y itemgetter :

 sorted(enumerate(a), key=lambda x: x[1]) # [(0, 1), (1, 2), (2, 3), (4, 5), (3, 100)] 

Comprima las listas juntas: el primer elemento en la tupla será el índice, el segundo es el valor (luego, ordénelo usando el segundo valor de la tupla x[1] , x es la tupla)

O usando itemgetter desde el itemgetter del operator :

 from operator import itemgetter sorted(enumerate(a), key=itemgetter(1)) 

Si no quieres usar numpy,

 sorted(range(len(seq)), key=seq.__getitem__) 

es el más rápido, como se demuestra aquí .

Importar numpy como np

Para indice

 S=[11,2,44,55,66,0,10,3,33] r=np.argsort(S) [output]=array([5, 1, 7, 6, 0, 8, 2, 3, 4]) 

argsort Devuelve los índices de S ordenados

POR VALOR

 np.sort(S) [output]=array([ 0, 2, 3, 10, 11, 33, 44, 55, 66])