Tengo algunos datos en una lista de listas o en una lista de tuplas, como esta:
data = [[1,2,3], [4,5,6], [7,8,9]]
data = [(1,2,3), (4,5,6), (7,8,9)]
Y quiero ordenar por el segundo elemento en el subconjunto. Es decir, ordenar por 2,5,8 de dónde 2es (1,2,3), 5es de (4,5,6). ¿Cuál es la forma común de hacer esto? ¿Debo almacenar tuplas o listas en mi lista?

Respuestas:
o:
fuente
key=itemgetter(1)y al comienzo del archivo:from operator import itemgettersortaquí hay un método deListobjeto de Python, que recibe una función lambda comokeyparámetro. Puedes nombrarlo comotup, ot, o lo que quieras y seguirá funcionando.tupaquí especifica el índice de la tupla de la lista, por1lo que significa que la clasificación se realizará por los segundos valores de las tuplas de la lista original (2, 5, 8).lambdaenfoque intuitivo es más simple que laitemgetterclaseitemgetterno intuitiva , de hecho parece ser más rápido . Tengo curiosidad de por qué es esto. Mi sospecha es quelambdaincurre en el costo oculto de capturar todas las variables locales en un contexto de cierre, mientras que unaitemgetterinstancia no lo hace. tl; dr: siempre useitemgetter, porque la velocidad gana.fuente
itemgetterlambdadata.sort(key=itemgetter(3,1))Solo quiero agregar a la respuesta de Stephen si desea ordenar la matriz de mayor a menor, otra forma que no sea en los comentarios anteriores es agregar esto a la línea:
y el resultado será el siguiente:
fuente
Para ordenar por múltiples criterios, es decir, por ejemplo, por el segundo y el tercer elemento en una tupla, dejemos
y así definir una lambda que devuelve una tupla que describe la prioridad, por ejemplo
fuente
La respuesta de Stephen es la que usaría. Para completar, aquí está el patrón DSU (decorar-ordenar-decorar) con listas de comprensión:
O, más brevemente:
Como se señaló en Python Sorting HowTo , esto ha sido innecesario desde Python 2.4, cuando las funciones clave estuvieron disponibles.
fuente
Para ordenar una lista de tuplas
(<word>, <count>),counten orden descendente yworden orden alfabético:Yo uso este método:
y me da el resultado:
fuente
Sin lambda:
fuente
itemgetter()es algo más rápido quelambda tup: tup[1], pero el aumento es relativamente modesto (alrededor del 10 al 25 por ciento).(Sesión de IPython)
fuente
¡La respuesta de @Stephen es al grano! Aquí hay un ejemplo para una mejor visualización,
¡Grita a los fanáticos de Ready Player One! =)
keyes una función que se llamará para transformar los elementos de la colección para comparación ... comocompareTométodo en Java.El parámetro pasado a la clave debe ser algo invocable. Aquí, el uso de
lambdacrea una función anónima (que es invocable).La sintaxis de lambda es la palabra lambda seguida de un nombre iterable y luego un solo bloque de código.
Debajo del ejemplo, estamos ordenando una lista de tuplas que contiene la información sobre el tiempo de cierto evento y el nombre del actor.
Estamos ordenando esta lista por hora de ocurrencia del evento, que es el elemento 0 de una tupla.
Nota:
s.sort([cmp[, key[, reverse]]])ordena los elementos de s en su lugarfuente
Ordenar una tupla es bastante simple:
fuente