>>> from operator import itemgetter
>>> data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]
>>> sorted(data,key=itemgetter(1))
[('abc', 121), ('abc', 148), ('abc', 221), ('abc', 231)]
OMI utilizando itemgetter
es más fácil de leer en este caso que la solución mediante @cheeken. Es también más rápido ya que casi todo el cálculo se realizará en el lado c
(sin juego de palabras) en lugar de mediante el uso de lambda
.
>python -m timeit -s "from operator import itemgetter; data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]" "sorted(data,key=itemgetter(1))"
1000000 loops, best of 3: 1.22 usec per loop
>python -m timeit -s "data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]" "sorted(data,key=lambda x: x[1])"
1000000 loops, best of 3: 1.4 usec per loop
+1 Me acuerdo en que 'itemgetter()' es una solución mejor.Sin embargo, pensé que una expresión lambda aclararía cómo funciona 'key'. – cheeken
+1 Sin embargo, cuando realicé la prueba de la velocidad, noté "ojo humano" que el que se suponía que era más rápido ... y que medía más rápido, en realidad era notablemente más lento. Me rasqué la cabeza en esto por un rato, luego tomé el módulo de tiempo de espera de python fuera de juego y solo usé el tiempo de Linux. es decir 'time \' python -c "el código" \ '' luego obtuve los resultados de 'ojo humano' que deletreas, así como los tiempos de reloj del sistema que eran más rápidos. Todavía no estoy seguro de por qué es esto, pero fue reproducible. Supongo que tiene algo que ver con la sobrecarga de la carga en el módulo, pero aún no acaba de hacerlo, por ahora. –
@JeffSheffield: Observe que jamylak está haciendo la importación en el código de configuración (fuera del tiempo), no el código probado. Eso es perfectamente razonable, porque la mayoría de los programas necesitarán clasificar más de una vez, o deben ordenar colecciones mucho más grandes, pero solo realizarán la importación una vez. (Y para aquellos programas que solo necesitan hacer un tipo más bien pequeño ... bueno, estás hablando de una diferencia de menos de un microsegundo, ¿a quién le importa de algún modo?) – abarnert