2012-04-18 24 views
5

Mientras trabajaba en un problema de la clase Google Python, formulé siguiente resultado mediante el uso de 2-3 ejemplos de Pila rebosanordenar una lista de tuplas en Python

def sort_last(tuples): 
    return [b for a,b in sorted((tup[1], tup) for tup in tuples)] 

print sort_last([(1, 3), (3, 2), (2, 1)]) 

supe comprensión Lista de ayer, por lo que saben una poco sobre la comprensión de la lista, pero estoy confundido sobre cómo esta solución funciona en general. Por favor, ayúdame a entender esto (2da línea en la función).

+0

va a añadir un enlace a la 'clase Google Python'? – xtian

+0

https://developers.google.com/edu/python/?csw=1 – Varun

Respuesta

6

Ese patrón se llama decorate-sort-undecorate.

  1. que encienda cada (1, 3) en (3, (1, 3)), envolviendo cada tuple en una nueva tupla, con el elemento que desea ordenar en primer lugar.
  2. Se ordena, con el tuple externo asegurando que el segundo elemento en el original tuple se ordena primero.
  3. Regresa de (3, (1, 3)) a (1, 3) mientras mantiene el orden de la lista.

En Python, la decoración explícita casi siempre es innecesaria. En su lugar, utilice el key argument of sorted:

sorted(list_of_tuples, key=lambda tup: tup[1]) # or key=operator.itemgetter(1) 

O, si desea ordenar en la versión invertida de la tuple, sin importar su longitud:

sorted(list_of_tuples, key=lambda tup: tup[::-1]) 
           # or key=operator.itemgetter(slice(None, None, -1)) 
+0

Muchas gracias, está claro ahora, ¿pueden decirme algo sobre lambda (sé que puedo encontrarlo al desbordamiento de la pila, pero quiero saber sobre su uso de lambda aquí) – Varun

+2

@Varun 'lambda' solo le permite declara una función dentro de una expresión. Es lo mismo que 'def first_item (tup): return tup [1]' fuera de la llamada a la función, luego 'key = first_item' en la llamada a la función. Ver [Lambda Forms] (http://docs.python.org/tutorial/controlflow.html#lambda-forms) en el tutorial de Python. – agf

+0

"Ese patrón se llama decorate-sort-undecorate" ... nunca se supo que tiene un nombre – Abhijit

2

Su ejemplo funciona creando una nueva lista con el elemento en el índice 1 seguido de la tupla original para cada tupla en la lista. P.ej. (3,(1,3)) para el primer elemento. La función ordenada ordena cada elemento a partir del índice 0, por lo que la lista se ordena por el segundo elemento. La función luego revisa cada elemento de la nueva lista y devuelve las tuplas originales.

Otra forma de hacerlo es mediante el uso del parámetro key en la función ordenada que se ordena en función del valor key. En este caso, desea que el key sea el artículo en cada tupla en el índice 1.

>>> from operator import itemgetter 
>>> sorted([(1, 3), (3, 2), (2, 1)],key=itemgetter(1)) 
+0

No revierte cada tupla de la lista. Envuelve cada tupla en otra tupla. – agf

+0

Ah, sí, me lo perdí, pensé que era tup [1], tup [0] pero ahora que volví a mirarlo, veo que lo he leído mal, voy a editar mi respuesta. – jamylak

3

Lets descomponerlo:

En : [(tup[1],tup) for tup in tuples]

de salida: [(3, (1, 3)), (2, (3, 2)), (1, (2, 1))]

Así que acabamos de crear una nueva tupla donde su primer valor es el último valor de la tupla interna; de esta manera, se ordena por el 2º valor de cada tupla en 'tuplas'.

Ahora ordenar la lista devuelta:

En: sorted([(3, (1, 3)), (2, (3, 2)), (1, (2, 1))])

de salida: [(1, (2, 1)), (2, (3, 2)), (3, (1, 3))]

lo que ahora tenemos nuestra lista ordenada por su segundo valor de cada tupla. Todo lo que queda es extraer la tupla original, y esto se hace tomando solo b del bucle for.

La lista de comprensión itera la lista dada (sorted([...] en este caso) y devuelve los valores extraídos por orden.

+0

Muchas gracias, muy bien explicado. – Varun

0

pls refieren a la respuesta aceptada .. + He aquí un ejemplo para una mejor visualización,

key es una función que será llamada para transformar los elementos de la colección para la comparación .. como compareTo método en Java.

El parámetro pasado a la clave debe ser algo que se puede llamar. Aquí, el uso de lambda crea una función anónima (que es invocable).
La sintaxis de lambda es la palabra lambda seguida de un nombre iterable y luego de un solo bloque de código.

Por debajo del ejemplo, estamos ordenando una lista de tuplas que contiene la información en tiempo de ciertos eventos y nombres de actores.

Estamos ordenando esta lista por momento de ocurrencia del evento, que es el 0º elemento de una tupla.

¡Grita por los fans de Ready Player One! =)

>>> gunters = [('2044-04-05', 'parzival'), ('2044-04-07', 'aech'), ('2044-04-06', 'art3mis')] 
>>> gunters.sort(key=lambda tup: tup[0]) 
>>> print gunters 
[('2044-04-05', 'parzival'), ('2044-04-06', 'art3mis'), ('2044-04-07', 'aech')] 

Nota - s.sort([cmp[, key[, reverse]]]) ordena los elementos de s en lugar

Cuestiones relacionadas