2010-09-16 7 views
5

¿Cuál es la mejor manera de ordenar una lista de flotantes por su valor, mientras se mantiene el registro del orden inicial.Ordenando mientras se preserva el orden en python

I.e. ordenar una:

a=[2.3, 1.23, 3.4, 0.4] 

vuelve algo así como

a_sorted = [0.4, 1.23, 2.3, 3.4] 
a_order = [4, 2, 1, 3] 

Si entiendes lo que digo.

Respuesta

14

se podría hacer algo como esto:

>>> sorted(enumerate(a), key=lambda x: x[1]) 
[(3, 0.4), (1, 1.23), (0, 2.3), (2, 3.4)] 

Si necesita indexación de comenzar con 1 en lugar de 0, enumerate acepta el segundo parámetro.

+0

+1 para usar enumerar! – GWW

+0

'aorder, asorted = zip (* ordenado (enumerar (a), clave = lambda x: x [1])' para completar – carl

+0

Estaría bastante seguro, OP necesitaría comprimir sus dos listas en un momento – SilentGhost

5
  • Utilice enumerate para generar los números de secuencia.
  • Uso sorted con un key para ordenar por los flotadores
  • Use zip para separar el orden de los valores

Por ejemplo:

a_order, a_sorted = zip(*sorted(enumerate(a), key=lambda item: item[1])) 
3

Si tiene numpy instalado:

import numpy 
a=[2.3, 1.23, 3.4, 0.4] 
a_sorted = numpy.sorted(a) 
a_order = numpy.argsort(a) 
+0

Esto es bueno para un chico más acostumbrado a matlab que python =) – Theodor

0
from itertools import izip 
a_order, a_sorted = [list(b) for b in izip(*sorted(enumerate(a, 1), key=lambda n: n[1]))] 
Cuestiones relacionadas