Tengo la siguiente lista creada a partir de un csv ordenado
list1 = sorted(csv1, key=operator.itemgetter(1))
En realidad, me gustaría ordenar la lista por dos criterios: primero por el valor en el campo 1 y luego por el valor en el campo 2. ¿Cómo hago esto?
__lt__()
método en su clase o herede de alguna clase que lo haga" ? Eso lo haría mucho mejor canónico.Respuestas:
Me gusta esto:
fuente
operator
es un módulo que necesita ser importado.No es necesario importar nada al usar funciones lambda.
Lo siguiente ordena
list
por el primer elemento, luego por el segundo elemento.fuente
-
en-x[1]
?Python tiene una clasificación estable, por lo que siempre que el rendimiento no sea un problema, la forma más simple es ordenarlo por el campo 2 y luego ordenarlo nuevamente por el campo 1.
Eso le dará el resultado que desea, el único inconveniente es que si se trata de una lista grande (o si desea ordenarla con frecuencia) llamar a ordenar dos veces podría ser una sobrecarga inaceptable.
Hacerlo de esta manera también facilita el manejo de la situación en la que desea que algunas de las columnas se ordenen de forma inversa, solo incluya el parámetro 'reverse = True' cuando sea necesario.
De lo contrario, puede pasar múltiples parámetros a itemgetter o construir manualmente una tupla. Probablemente sea más rápido, pero tiene el problema de que no se generaliza bien si algunas de las columnas quieren ser ordenadas en reversa (las columnas numéricas aún pueden revertirse negándolas pero eso impide que la ordenación sea estable).
Entonces, si no necesita ninguna columna ordenada inversamente, busque múltiples argumentos para agregar elementos, si lo desea, y las columnas no son numéricas o si desea mantener la clasificación estable, vaya a varias clasificaciones consecutivas.
Editar: Para los comentaristas que tienen problemas para entender cómo esto responde a la pregunta original, aquí hay un ejemplo que muestra exactamente cómo la naturaleza estable de la clasificación garantiza que podamos hacer clasificaciones separadas en cada clave y terminar con datos ordenados en múltiples criterios:
Este es un ejemplo ejecutable, pero para salvar a las personas que lo ejecutan, el resultado es:
Observe en particular cómo en el segundo paso el
reverse=True
parámetro mantiene los nombres en orden, mientras que simplemente ordenar y revertir la lista perdería el orden deseado para la tercera clave de clasificación.fuente
fuente
tuple()
pueda recibir dos argumentos (o más bien, tres, si cuentaself
)return
declaración debe serreturn tuple((x[1], x[2]))
o simplementereturn x[1], x[2]
. Consulte @jaap respuesta a continuación si está buscando ordenar en diferentes direccionestuple(x[1:3])
, si desea utilizar el constructor de tuplas por algún motivo en lugar de solo una lista de visualización de tuplasx[1], x[2]
. Okeyfunc = operator.itemgetter(1, 2)
y ni siquiera escriba una función usted mismo.También podemos usar .sort con lambda 2 veces porque la ordenación de Python está en su lugar y es estable. Esto ordenará primero la lista según el segundo elemento, x [1]. Luego, ordenará el primer elemento, x [0] (máxima prioridad).
Esto es equivalente a hacer lo siguiente: employee.sort (key = lambda x: (x [0], x [1]))
fuente
En orden ascendente puede usar:
o en orden descendente puedes usar:
fuente
La lista de clasificación de los dictados utilizando a continuación ordenará la lista en orden descendente en la primera columna como salario y la segunda columna como edad
Resultado: [{'salario': 123, 'edad': 25}, {'salario': 123, 'edad': 23}]
fuente