Saltar al contenido
Editor

Ordenar en Python: sort(), sorted(), key y orden personalizado

Intermedio25 min6 ejercicios85 XP

Esta lección es una traducción del original en inglés.Read in EnglishAvisar de un error de traducción

0/6 ejercicios

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.

sort() cambia la lista original
# sort() modifies the original list
numbers = [5, 2, 8, 1, 9]
numbers.sort()
print(numbers) # [1, 2, 5, 8, 9] - the list itself changed
Salida
[1, 2, 5, 8, 9]
sorted() crea una lista nueva
# sorted() returns a NEW sorted list
numbers = [5, 2, 8, 1, 9]
result = sorted(numbers)
print(result) # [1, 2, 5, 8, 9] - a new list
print(numbers) # [5, 2, 8, 1, 9] - original unchanged!
Salida
[1, 2, 5, 8, 9]
[5, 2, 8, 1, 9]
Error: asignar el resultado de sort()
names = ['Charlie', 'Alice', 'Bob']
result = names.sort()
print(result)  # None!
Solución: usa sorted() para obtener una lista nueva
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.

sorted() funciona con cualquier iterable
# sorted() works on strings too
letters = sorted("python")
print(letters) # ['h', 'n', 'o', 'p', 't', 'y']
# sorted() works on tuples
coords = sorted((3, 1, 4, 1, 5))
print(coords) # [1, 1, 3, 4, 5] - result is always a list
Salida
['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.

Ordenar de forma ascendente y descendente
scores = [72, 95, 88, 61, 100]
# Ascending (default)
print(sorted(scores)) # [61, 72, 88, 95, 100]
# Descending
print(sorted(scores, reverse=True)) # [100, 95, 88, 72, 61]
Salida
[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.

Ordenar cadenas al revés
fruits = ['banana', 'apple', 'cherry', 'date']
print(sorted(fruits)) # ['apple', 'banana', 'cherry', 'date']
print(sorted(fruits, reverse=True)) # ['date', 'cherry', 'banana', 'apple']
Salida
['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.

Ordenar por longitud de cadena con key=len
# Sort words by length instead of alphabetically
words = ['banana', 'pie', 'strawberry', 'kiwi']
result = sorted(words, key=len)
print(result) # ['pie', 'kiwi', 'banana', 'strawberry']
Salida
['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.

Ordenar sin distinguir mayúsculas de minúsculas
# Without key - uppercase letters sort before lowercase
names = ['alice', 'Bob', 'CHARLIE', 'dave']
print(sorted(names)) # ['Bob', 'CHARLIE', 'alice', 'dave']
# With key=str.lower - true alphabetical order
print(sorted(names, key=str.lower)) # ['alice', 'Bob', 'CHARLIE', 'dave']
Salida
['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.

Ordenar por el último dígito con una lambda
# Sort numbers by their last digit
numbers = [23, 45, 12, 67, 34, 89]
result = sorted(numbers, key=lambda x: x % 10)
print(result) # [12, 23, 34, 45, 67, 89]
Salida
[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.

Ordenar por el último carácter
# Sort strings by their last character
words = ['hello', 'zebra', 'apple', 'mango']
result = sorted(words, key=lambda w: w[-1])
print(result) # ['zebra', 'apple', 'mango', 'hello']
Salida
['zebra', 'apple', 'hello', 'mango']
Ordenar por varios criterios con tuplas
# Sort by length first, then alphabetically
words = ['cat', 'bat', 'elephant', 'ant', 'dog']
result = sorted(words, key=lambda w: (len(w), w))
print(result) # ['ant', 'bat', 'cat', 'dog', 'elephant']
Salida
['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.

Ordenar una lista de diccionarios por una clave
students = [
{'name': 'Alice', 'grade': 92},
{'name': 'Bob', 'grade': 85},
{'name': 'Charlie', 'grade': 97},
{'name': 'Diana', 'grade': 88},
]
# Sort by grade (ascending)
by_grade = sorted(students, key=lambda s: s['grade'])
for s in by_grade:
print(f"{s['name']}: {s['grade']}")
Salida
Bob: 85
Diana: 88
Alice: 92
Charlie: 97
Ordenar diccionarios en orden descendente
students = [
{'name': 'Alice', 'grade': 92},
{'name': 'Bob', 'grade': 85},
{'name': 'Charlie', 'grade': 97},
{'name': 'Diana', 'grade': 88},
]
# Sort by grade (highest first)
top_students = sorted(students, key=lambda s: s['grade'], reverse=True)
for s in top_students:
print(f"{s['name']}: {s['grade']}")
Salida
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.

Ordenar las claves y los valores de un diccionario
prices = {'banana': 1.20, 'apple': 0.80, 'cherry': 3.50, 'date': 5.00}
# Sort by key (fruit name)
for fruit in sorted(prices):
print(f"{fruit}: ${prices[fruit]}")
print()
# Sort by value (price)
for fruit in sorted(prices, key=lambda f: prices[f]):
print(f"{fruit}: ${prices[f]}")
Salida
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.

El ordenamiento estable conserva el orden original en los empates
students = [
{'name': 'Alice', 'grade': 90},
{'name': 'Bob', 'grade': 85},
{'name': 'Charlie', 'grade': 90},
{'name': 'Diana', 'grade': 85},
]
# Sort by grade - ties keep original order
result = sorted(students, key=lambda s: s['grade'])
for s in result:
print(f"{s['name']}: {s['grade']}")
# Bob: 85, Diana: 85, Alice: 90, Charlie: 90
# Bob comes before Diana (original order preserved)
# Alice comes before Charlie (original order preserved)
Salida
Bob: 85
Diana: 85
Alice: 90
Charlie: 90

Ejercicios de práctica

Ordena una lista de números
Escribe el código

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.

scores = [78, 92, 65, 88, 95, 71]
# Print scores low to high
# Print scores high to low
Predice la salida: sort() frente a sorted()
Predice la salida

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.

nums = [3, 1, 4, 1, 5]
result = nums.sort()
print(result)
print(nums)
Ordena palabras por longitud
Escribe el código

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.

words = ['elephant', 'cat', 'giraffe', 'ox', 'bear', 'ant']
# Sort by length and print
Corrige el error: ordenar distinguiendo mayúsculas
Corrige el error

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']

names = ['Charlie', 'alice', 'Eve', 'dave', 'Bob']
result = sorted(names)
print(result)
Ordena estudiantes por nota
Escribe el código

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

students = [
{'name': 'Alice', 'grade': 88},
{'name': 'Bob', 'grade': 95},
{'name': 'Charlie', 'grade': 72},
{'name': 'Diana', 'grade': 91},
]
# Sort by grade (highest first) and print each student
Ordena por varios criterios
Escribe el código

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

products = [
{'name': 'Banana', 'category': 'fruit', 'price': 1.20},
{'name': 'Milk', 'category': 'dairy', 'price': 3.50},
{'name': 'Apple', 'category': 'fruit', 'price': 0.80},
{'name': 'Cheese', 'category': 'dairy', 'price': 5.00},
{'name': 'Cherry', 'category': 'fruit', 'price': 4.00},
{'name': 'Yogurt', 'category': 'dairy', 'price': 2.50},
]
# Sort by category, then by price within each category

Tutoriales relacionados

¿Te sirvió este tutorial?

Sugerir una mejora