2009-03-13 17 views
53

Empíricamente, parece que el clasificador de listas por defecto de Python, al pasar una lista de tuplas, ordenará por el primer elemento en cada tupla. ¿Es eso correcto? Si no, ¿cuál es la forma correcta de ordenar una lista de tuplas por sus primeros elementos?¿Cómo clasifica Python una lista de tuplas?

+5

¿Realmente ejecutar código de ejemplo? Si es así, ¿qué viste? Por favor, publique su código de muestra. –

Respuesta

67

Clasifica automáticamente una lista de tuplas por los primeros elementos en las tuplas, luego por los segundos elementos y así sucesivamente tupla ([1,2,3]) irá antes de tupla ([1,2,4]) . Si desea anular este comportamiento pase un invocable como el segundo argumento al método de ordenación. Este invocable debe devolver 1, -1, 0.

+15

¡No use el argumento cmp si el argumento clave para ordenar lo hará! Es preferible foo.sort (clave = lambda x: x [1]) a foo.sort (lambda x, y: cmp (x [1], y [1])). Es más fácil de entender y mucho más eficiente. – cthulahoops

+9

@cthulahoops Creo que usar 'operator.itemgetter' es en ese caso mejor que la función lambda:' foo.sort (clave = operator.itemgetter (1)) 'es mejor que' foo.sort (clave = lambda x: x [1]) '. Sin embargo, es solo mi opinión. –

+0

Sin embargo, sería bueno tener un enlace relevante a la documentación. – gaazkam

8

Sí, este es el valor predeterminado. De hecho, esta es la base de la clásica expresión "DSU" (Decorate-Sort-Undecorate) en Python. Ver Code Like a Pythonista.

5

No, las tuplas son sequence types como cadenas. Se clasifican de la misma, mediante la comparación de cada elemento a su vez:

>>> import random 
>>> sorted([(0,0,0,int(random.getrandbits(4))) for x in xrange(10)]) 
[(0, 0, 0, 0), (0, 0, 0, 4), (0, 0, 0, 5), (0, 0, 0, 7), (0, 0, 0, 8), 
(0, 0, 0, 9), (0, 0, 0, 12), (0, 0, 0, 12), (0, 0, 0, 12), (0, 0, 0, 14)] 

Los tres ceros están allí sólo para mostrar que algo más que el primer elemento debe estar recibiendo inspeccionado.

+0

Hm. Parece que soy una minoría ... No entiendo los resultados de mi prueba, si Python clasifica mirando solo el primer elemento en cada tupla. – unwind

+0

Comienza con el primer elemento, pero luego se mueve. Ver la respuesta de Vasil –

0

Pruebe usar el método de clasificación de lista interna y pase una lambda. Si tu primer elemento de tuplas es un entero, esto debería funcionar.

# l is the list of tuples 
l.sort(lambda x,y: x-y) 

Puede usar cualquier llamante para la función de comparación, no necesariamente una lambda. Sin embargo, necesita devolver -1 (menor que), 0 (igual) o 1 (mayor que).

+0

-1: ¿Cómo funcionará esto con una lista de tuplas? Obtengo TypeError: tipo (s) de operandos no soportados para -: 'tuple' y 'tuple' –

+0

La función lambda que se ejecutará en sort tiene que tener un argumento, que es el elemento iteratables de una serie tupla: pairs.sort (clave = par lambda: par [1]). pares.sort (clave = par lambda: par [1]) o pares.sort (clave = par lambda: par [1], par [0]) si desea tener una segunda capa de orden después de ordenar por el primer elemento . – Alex

Cuestiones relacionadas