2010-08-04 13 views
5

A menudo hago arreglos en Python usando expresiones lambda, y aunque funciona bien, no me parece muy legible, y esperaba que hubiera una mejor manera. Aquí hay un caso de uso típico para mí.ordenación python sin expresiones lambda

tengo una lista de números, por ejemplo, x = [12, 101, 4, 56, ...]

Tengo una lista separada de los índices: y = range(len(x))

Quiero ordenar y basado en los valores de x, y hago esto:

y.sort(key=lambda a: x[a]) 

¿Hay una buena manera de hacerlo sin usar lambda?

+0

alguna razón en particular por las que una lista ordenada de los valores originales no sería suficiente? 'x_sorted = ordenado (x)' – MattH

+1

El OP quiere los índices de los elementos en orden, no los elementos en sí mismos. – PaulMcG

+1

Es una pena que 'lambda' sea una palabra clave tan larga y fea. Esta es más o menos la manera de hacerlo. – PaulMcG

Respuesta

11

Puede usar el método __getitem__ de la lista x. Esto comporta igual que su lambda y será mucho más rápido, ya que se implementa como una función C en lugar de una función de Python:

>>> x = [12, 101, 4, 56] 
>>> y = range(len(x)) 
>>> sorted(y, key=x.__getitem__) 
[2, 0, 3, 1] 
+0

Gracias, creo que esta es la solución más fácil de leer. –

5
No

elegantemente, pero:

[a for (v, a) in sorted((x[a], a) for a in y)] 

Por cierto, usted puede hacer esto sin crear una lista separada de los índices:

2

No estoy seguro de si este es el tipo de alternativa que quería decir, pero se podría definir la función de la tecla con un def:

def sort_key(value): 
    return x[value] 

y.sort(key = sort_key) 

personal, creo que t el suyo es peor que el lambda ya que aleja los criterios de ordenación de la línea de código que realiza el ordenamiento y agrega innecesariamente la función sort_key a su espacio de nombres.

0

supongo que si yo quería crear otra función, que podría hacerlo algo como esto (no probado):

def sortUsingList(indices, values): 
    return indices[:].sort(key=lambda a: values[a]) 

Aunque creo que yo prefiero usar lambda en lugar de evitar tener que crear una función extra .

+0

Está utilizando lambda contra su solicitud (aunque yo mismo lo usaría). –