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 2
es (1,2,3)
, 5
es 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 itemgetter
sort
aquí hay un método deList
objeto de Python, que recibe una función lambda comokey
parámetro. Puedes nombrarlo comotup
, ot
, o lo que quieras y seguirá funcionando.tup
aquí especifica el índice de la tupla de la lista, por1
lo que significa que la clasificación se realizará por los segundos valores de las tuplas de la lista original (2, 5, 8
).lambda
enfoque intuitivo es más simple que laitemgetter
claseitemgetter
no intuitiva , de hecho parece ser más rápido . Tengo curiosidad de por qué es esto. Mi sospecha es quelambda
incurre en el costo oculto de capturar todas las variables locales en un contexto de cierre, mientras que unaitemgetter
instancia no lo hace. tl; dr: siempre useitemgetter
, porque la velocidad gana.fuente
itemgetter
lambda
data.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>)
,count
en orden descendente yword
en 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! =)
key
es una función que se llamará para transformar los elementos de la colección para comparación ... comocompareTo
método en Java.El parámetro pasado a la clave debe ser algo invocable. 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 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