Ordenar una lista de listas por longitud y valor en Python
python-2.7 (2)
¿Cómo puedo ordenar una lista de Python (con sublistas)? Por ejemplo, tengo la siguiente lista:
list1 = [[0, 4, 1, 5], [3, 1, 5], [4, 0, 1, 5]]
Después de la clasificación estoy esperando:
list1 = [[3, 1, 5], [0, 4, 1, 5], [4, 0, 1, 5]]
Otro ejemplo. Tengo la siguiente lista:
list2 = [[4, 5, 2], [2, 5, 4], [2, 4, 5]]
Después de la clasificación estoy esperando:
list2 = [[2, 4, 5], [2, 5, 4], [4, 5, 2]]
Al principio quiero ordenar por longitud, y luego por elemento en cada sublista. No quiero ordenar ninguna sublista.
He probado el siguiente código, que me ayudó a ordenar solo por la longitud:
list1.sort(key=len)
El método list.sort () de Python es "estable", es decir, el orden relativo de los elementos que comparan igual no cambia. Por lo tanto, también puede lograr el orden deseado llamando a sort () dos veces:
>>> list1 = [[3, 1, 5], [0, 4, 1, 5], [4, 0, 1, 5]]
>>> list1.sort() # sort by sublist contents
>>> list1.sort(key=len) # sort by sublist length
>>> list1
[[3, 1, 5], [0, 4, 1, 5], [4, 0, 1, 5]]
Necesitas una clave como:
lambda l: (len(l), l)
Cómo:
Esto utiliza un lambda
para crear una tuple
que se puede usar tuple para clasificar de la manera deseada. Esto funciona porque las tuplas ordenan elemento por elemento.
Código de prueba:
list1 = [[0, 4, 1, 5], [3, 1, 5], [4, 0, 1, 5]]
print(sorted(list1, key=lambda l: (len(l), l)))
list2 = [[4, 5, 2], [2, 5, 4], [2, 4, 5]]
print(sorted(list2, key=lambda l: (len(l), l)))
Resultados:
[[3, 1, 5], [0, 4, 1, 5], [4, 0, 1, 5]]
[[2, 4, 5], [2, 5, 4], [4, 5, 2]]