Ordenar en Python: sort(), sorted(), key y orden personalizado
Esta lección es una traducción del original en inglés.Read in EnglishAvisar de un error de traducción
Imagina la estantería de tu casa. Los libros están por todas partes: unos por título, otros por color, otros metidos de lado. Encontrar algo lleva una eternidad.
Ahora imagina que ordenas esa estantería alfabéticamente. De pronto, encontrar cualquier libro te lleva segundos. Ese es el poder de ordenar: convierte el caos en orden.
Python te da dos herramientas principales para ordenar: el método sort() y la función sorted(). Se parecen, pero funcionan de forma distinta. En este tutorial aprenderás cuándo usar cada una, cómo ordenar al revés y cómo ordenar con tus propias reglas usando funciones clave.
¿Cuál es la diferencia entre sort() y sorted()?
Esta es la distinción más importante al ordenar en Python. El método sort() cambia directamente la lista original. La función sorted() crea una lista ordenada totalmente nueva y deja la original intacta.
Piénsalo así: sort() es como reacomodar los libros de tu estantería. sorted() es como hacer un catálogo ordenado y dejar la estantería exactamente como estaba.
[1, 2, 5, 8, 9]
[1, 2, 5, 8, 9] [5, 2, 8, 1, 9]
names = ['Charlie', 'Alice', 'Bob']
result = names.sort()
print(result) # None!names = ['Charlie', 'Alice', 'Bob']
result = sorted(names)
print(result) # ['Alice', 'Bob', 'Charlie']Hay otra gran diferencia: sorted() funciona con cualquier iterable (cadenas, tuplas, diccionarios e incluso generadores). El método sort() solo funciona con listas.
['h', 'n', 'o', 'p', 't', 'y'] [1, 1, 3, 4, 5]
Cómo ordenar en orden inverso
Tanto sort() como sorted() aceptan un parámetro reverse. Ponlo en True para ordenar de mayor a menor en vez de menor a mayor.
[61, 72, 88, 95, 100] [100, 95, 88, 72, 61]
Por defecto, las cadenas se ordenan alfabéticamente. Con reverse=True, se ordenan en orden alfabético inverso.
['apple', 'banana', 'cherry', 'date'] ['date', 'cherry', 'banana', 'apple']
¿Qué son las funciones clave al ordenar en Python?
A veces no quieres ordenar por los valores en sí. Quieres ordenar por alguna propiedad de cada valor. Por ejemplo, ordenar palabras por su longitud en vez de alfabéticamente.
El parámetro key te permite pasar una función que transforma cada elemento antes de compararlo. Python aplica esa función a cada elemento y luego ordena según los resultados. Los elementos originales no cambian: solo cambia el orden.
['pie', 'kiwi', 'banana', 'strawberry']
Aquí, len es la función clave. Python llama a len() con cada palabra y usa esas longitudes para decidir el orden. "pie" tiene 3 letras, "kiwi" tiene 4, y así sucesivamente.
Puedes usar cualquier función como clave. Un ejemplo habitual es ordenar sin distinguir mayúsculas de minúsculas con str.lower.
['Bob', 'CHARLIE', 'alice', 'dave'] ['alice', 'Bob', 'CHARLIE', 'dave']
Cómo ordenar con funciones lambda
Las funciones integradas como len y str.lower tienen un límite. Cuando necesitas una lógica de orden propia, usas una lambda: una función pequeña y anónima escrita en una sola línea.
Una lambda recibe un elemento y devuelve el valor por el que se ordena. La sintaxis es lambda item: expression.
[12, 23, 34, 45, 67, 89]
La lambda lambda x: x % 10 toma cada número y devuelve su último dígito (el resto de dividirlo entre 10). Luego Python ordena según esos últimos dígitos: 2, 3, 4, 5, 7, 9.
['zebra', 'apple', 'hello', 'mango']
['ant', 'bat', 'cat', 'dog', 'elephant']
Cómo ordenar diccionarios y datos complejos
En los programas reales, rara vez ordenas listas simples de números. Lo más habitual es ordenar listas de diccionarios, como ordenar estudiantes por nota o productos por precio.
Bob: 85 Diana: 88 Alice: 92 Charlie: 97
Charlie: 97 Alice: 92 Diana: 88 Bob: 85
También puedes ordenar las claves o los valores de un diccionario. La función sorted() recorre por defecto las claves del diccionario.
apple: $0.8 banana: $1.2 cherry: $3.5 date: $5.0 Traceback (most recent call last): File "<exec>", line 11, in <module> NameError: name 'f' is not defined
¿Qué es un ordenamiento estable y por qué importa?
Python usa un algoritmo de ordenamiento llamado Timsort, que es estable. Esto significa que, cuando dos elementos son iguales según la clave de ordenamiento, mantienen su orden original.
Esto importa mucho en la práctica. Si ordenas estudiantes por nota y dos tienen la misma nota, se quedarán en el mismo orden en que estaban antes de ordenar.
Bob: 85 Diana: 85 Alice: 90 Charlie: 90
Ejercicios de práctica
Tienes una lista de puntuaciones de exámenes. Imprímelas ordenadas de menor a mayor y, en la línea siguiente, ordenadas de mayor a menor.
Usa sorted() para que la lista original no cambie.
Lee con atención el código de abajo. ¿Qué va a imprimir? Recuerda la diferencia clave entre sort() y sorted().
Escribe la salida exacta.
Ordena la lista de palabras por su longitud (las más cortas primero). Si dos palabras tienen la misma longitud, deben quedarse en su orden original.
Imprime la lista ordenada.
El código de abajo intenta ordenar nombres alfabéticamente, pero los nombres en mayúscula y en minúscula se mezclan mal. Corrige el orden para que sea alfabético de verdad, sin importar las mayúsculas.
La salida debe ser: ['alice', 'Bob', 'Charlie', 'dave', 'Eve']
Ordena la lista de estudiantes por su nota, de la más alta a la más baja. Imprime el nombre y la nota de cada estudiante en una línea aparte, con el formato: Name: Grade
Ordena la lista de productos primero por categoría (alfabéticamente) y luego por precio (el más bajo primero) dentro de cada categoría.
Imprime cada producto en una línea aparte, con el formato: category: name - $price