Ordenar datos es una tarea frecuente en listas de nombres, precios, fechas, puntuaciones y registros. Python ofrece dos herramientas principales: el método list.sort() y la función integrada sorted(). Ambos pueden producir el mismo orden, pero no se comportan igual.
En esta guía aprenderás la diferencia entre sort() y sorted() en Python, cuándo usar cada opción, cómo ordenar de forma descendente, aplicar claves personalizadas, combinar varios criterios y evitar errores relacionados con la modificación de listas.
Diferencia principal
sort() modifica la lista original y devuelve None. sorted() crea una lista nueva y acepta cualquier iterable.
numeros = [8, 3, 10, 1]
resultado = numeros.sort()
print(numeros) # [1, 3, 8, 10]
print(resultado) # Nonenumeros = [8, 3, 10, 1]
ordenados = sorted(numeros)
print(numeros) # [8, 3, 10, 1]
print(ordenados) # [1, 3, 8, 10]Antes de continuar, conviene dominar las operaciones básicas explicadas en la guía de listas en Python.
Cuándo usar sort()
Utiliza sort() cuando ya tienes una lista, quieres modificarla de forma intencional y no necesitas conservar el orden anterior.
tareas = ["revisar", "publicar", "escribir"]
tareas.sort()
for tarea in tareas:
print(tarea)La modificación en el lugar evita crear otra lista completa. Sin embargo, cualquier parte del programa que comparta la misma referencia verá el nuevo orden.
Cuándo usar sorted()
Utiliza sorted() cuando quieras preservar el original, trabajar con una tupla, un conjunto, un diccionario o un generador, o producir directamente una lista nueva.
coordenadas = (4, 1, 9, 2)
ordenadas = sorted(coordenadas)
print(coordenadas)
print(ordenadas)El resultado de sorted() siempre es una lista, aunque la entrada sea otro tipo de iterable.
Orden descendente
Ambas herramientas aceptan reverse=True.
puntuaciones = [72, 95, 88, 61]
puntuaciones.sort(reverse=True)
print(puntuaciones)precios = (29.90, 10.50, 75.00)
mayor_a_menor = sorted(precios, reverse=True)
print(mayor_a_menor)Ordenar texto sin distinguir mayúsculas
nombres = ["ana", "Carlos", "beatriz", "Álvaro"]
ordenados = sorted(nombres, key=str.casefold)
print(ordenados)key recibe una función que calcula el valor utilizado para ordenar. Los elementos originales permanecen intactos. La guía de funciones en Python ayuda a comprender por qué podemos pasar una función como argumento.
Ordenar por longitud
palabras = ["api", "programación", "python", "web"]
por_longitud = sorted(palabras, key=len)
print(por_longitud)Cuando dos elementos tienen la misma clave, Python mantiene su orden relativo original. Esta propiedad se conoce como ordenación estable.
Ordenar diccionarios por un campo
productos = [
{"nombre": "Teclado", "precio": 49.90},
{"nombre": "Ratón", "precio": 24.50},
{"nombre": "Monitor", "precio": 219.00},
]
por_precio = sorted(
productos,
key=lambda producto: producto["precio"],
)
for producto in por_precio:
print(producto["nombre"], producto["precio"])Los registros del ejemplo utilizan las estructuras explicadas en la guía de diccionarios en Python. Una función lambda es adecuada cuando la clave es breve; para lógica compleja, una función con nombre suele ser más clara.
Usar itemgetter y attrgetter
from operator import itemgetter
usuarios = [
{"nombre": "Marta", "edad": 34},
{"nombre": "Luis", "edad": 25},
{"nombre": "Ana", "edad": 29},
]
usuarios_ordenados = sorted(
usuarios,
key=itemgetter("edad"),
)itemgetter() evita una lambda cuando solo necesitas extraer una clave. Para objetos, attrgetter() cumple un papel similar con atributos.
Ordenar por varios criterios
Una tupla como clave permite definir prioridades.
personas = [
{"ciudad": "Lima", "nombre": "Sofía"},
{"ciudad": "Quito", "nombre": "Ana"},
{"ciudad": "Lima", "nombre": "Carlos"},
]
resultado = sorted(
personas,
key=lambda persona: (
persona["ciudad"].casefold(),
persona["nombre"].casefold(),
),
)Combinar ascendente y descendente
resultados = [
{"equipo": "A", "puntos": 20, "faltas": 3},
{"equipo": "B", "puntos": 25, "faltas": 7},
{"equipo": "C", "puntos": 25, "faltas": 2},
]
clasificacion = sorted(
resultados,
key=lambda fila: (-fila["puntos"], fila["faltas"]),
)Los puntos se niegan para que los valores mayores aparezcan primero, mientras las faltas permanecen ascendentes.
Ordenar fechas correctamente
Las fechas deben convertirse a objetos date o datetime cuando el formato textual no garantiza un orden cronológico.
from datetime import datetime
fechas = ["20/07/2026", "01/06/2026", "15/07/2026"]
ordenadas = sorted(
fechas,
key=lambda texto: datetime.strptime(texto, "%d/%m/%Y"),
)Consulta la guía de datetime en Python para aprender a analizar y comparar fechas.
Ordenar valores con None
Python no compara directamente None con números. Define una regla explícita.
valores = [10, None, 3, None, 8]
ordenados = sorted(
valores,
key=lambda valor: (
valor is None,
valor if valor is not None else 0,
),
)La guía sobre None en Python explica por qué representa ausencia y no equivale a cero o una cadena vacía.
Error frecuente: guardar el resultado de sort()
numeros = [3, 1, 2]
ordenados = numeros.sort()
print(ordenados) # NoneUsa numeros.sort() y después trabaja con la misma lista, o asigna sorted(numeros) a una variable nueva.
Rendimiento y memoria
sort() reutiliza la lista existente, mientras sorted() crea una lista nueva. Ambos emplean una ordenación estable y funcionan especialmente bien con datos parcialmente ordenados. Elige primero según la semántica: modificar el original o producir un resultado independiente.
Conclusión
Utiliza sort() cuando quieras modificar una lista de forma explícita. Utiliza sorted() cuando necesites preservar el original o trabajar con otro iterable. Para criterios personalizados, define key, usa tuplas para varias prioridades y aprovecha la estabilidad del algoritmo.






