Ordenar listas
Aprende a ordenar listas en Python con sorted() y sort(), usa el parámetro key, ordena en reversa y trabaja con objetos personalizados con ejemplos.
Ordenar una lista es una de las operaciones más comunes en Python. Python te ofrece dos herramientas integradas para esto: la función sorted(), que devuelve una nueva lista ordenada sin modificar la original, y el método list.sort(), que reordena la lista en su lugar. Ambas aceptan un indicador reverse para el orden descendente y un parámetro key para lógica de ordenación personalizada.
Este capítulo cubre:
sorted()— ordena cualquier iterable en una nueva listalist.sort()— ordena una lista en su lugar- Ordenar en orden ascendente y descendente
- El parámetro
key— ordenar por longitud, campo o cualquier criterio personalizado - Ordenación sin distinción de mayúsculas y minúsculas
- Ordenar listas de diccionarios y objetos personalizados
- Ordenación por múltiples claves
operator.itemgettercomo alternativa eficiente a lambda
Para repasar los fundamentos de las listas, consulta los capítulos Python Lists y List Methods.
La función sorted()
sorted() toma cualquier iterable (lista, tupla, string, …) y devuelve una nueva lista ordenada. El iterable original queda sin cambios.
Sintaxis:
sorted(iterable, *, key=None, reverse=False)iterable— la secuencia a ordenarkey— una función opcional de un argumento que se aplica a cada elemento antes de comparar (por defecto: comparar los elementos directamente)reverse— establécelo enTruepara ordenar en orden descendente (por defecto:False)
Ordenar una lista de strings
Ordenar una lista de números
Las listas numéricas se ordenan por magnitud, no por representación como string (por lo que 10 no se ordena antes que 9).
nums = [3, 1, 4, 1, 5, 9, 2, 6]
print(sorted(nums))
# [1, 1, 2, 3, 4, 5, 6, 9]Ordenar en orden descendente con reverse=True
Pasa reverse=True para obtener primero los valores más grandes.
nums = [3, 1, 4, 1, 5, 9, 2, 6]
print(sorted(nums, reverse=True))
# [9, 6, 5, 4, 3, 2, 1, 1]El método list.sort()
list.sort() reordena la lista en su lugar y siempre devuelve None. Úsalo cuando ya no necesites el orden original y quieras evitar el consumo de memoria de una segunda lista.
Sintaxis:
list.sort(*, key=None, reverse=False)Los parámetros son idénticos a los de sorted().
Ordenar una lista en su lugar
Ordenar en orden descendente
sort() devuelve None — un error común
Un error frecuente es asignar el resultado de sort() a una variable:
fruits = ['banana', 'apple', 'cherry']
result = fruits.sort() # sort() modifies fruits, returns None
print(result) # None ← not the sorted list!
print(fruits) # ['apple', 'banana', 'cherry'] ← fruits was modifiedSi necesitas tanto el resultado ordenado como el orden original, usa sorted() en su lugar.
sorted() vs list.sort() — Cuándo usar cada uno
sorted() | list.sort() | |
|---|---|---|
| Devuelve | Una nueva lista ordenada | None |
| Lista original | Sin cambios | Modificada en su lugar |
| Funciona con | Cualquier iterable | Solo listas |
| Memoria | Usa memoria adicional | Sin lista extra |
Usa sorted() cuando necesites que el original permanezca sin cambios, o cuando ordenes una tupla u otro iterable.
Usa list.sort() cuando tengas una lista, quieras ordenarla en su lugar y la eficiencia de memoria sea importante.
Ordenar con el parámetro key
El parámetro key acepta un callable de un argumento. Python lo llama una vez en cada elemento y usa el valor devuelto para las comparaciones. Esto evita duplicar datos y hace que la ordenación sea flexible.
Ordenar por longitud de string
words = ['banana', 'apple', 'cherry', 'kiwi']
print(sorted(words, key=len))
# ['kiwi', 'apple', 'banana', 'cherry']len se pasa directamente — no se necesita lambda cuando se usa una función integrada que toma un argumento.
Ordenar una lista de tuplas por un campo específico
La lambda lambda x: x[1] extrae el segundo elemento (el número) de cada tupla para que Python compare números en lugar de tuplas completas.
Ordenar una lista de diccionarios
students = [
{'name': 'Charlie', 'grade': 85},
{'name': 'Alice', 'grade': 92},
{'name': 'Bob', 'grade': 78},
]
by_grade = sorted(students, key=lambda s: s['grade'])
for s in by_grade:
print(s['name'], s['grade'])
# Bob 78
# Charlie 85
# Alice 92Para ordenar en orden descendente (la nota más alta primero), agrega reverse=True:
by_grade_desc = sorted(students, key=lambda s: s['grade'], reverse=True)
for s in by_grade_desc:
print(s['name'], s['grade'])
# Alice 92
# Charlie 85
# Bob 78Ordenación sin distinción de mayúsculas y minúsculas
Por defecto, la ordenación de Python distingue entre mayúsculas y minúsculas: todas las letras mayúsculas aparecen antes que las minúsculas porque tienen puntos de código Unicode menores. Usa key=str.lower para ordenar sin importar las mayúsculas.
words = ['Banana', 'apple', 'Cherry', 'date']
print(sorted(words)) # case-sensitive (uppercase first)
# ['Banana', 'Cherry', 'apple', 'date']
print(sorted(words, key=str.lower)) # case-insensitive
# ['apple', 'Banana', 'Cherry', 'date']Uso de operator.itemgetter y operator.attrgetter
El módulo operator proporciona alternativas más rápidas a lambda para patrones de clave comunes.
operator.itemgetter — para secuencias y diccionarios
import operator
fruits = [('apple', 10), ('banana', 5), ('cherry', 20)]
print(sorted(fruits, key=operator.itemgetter(1)))
# [('banana', 5), ('apple', 10), ('cherry', 20)]operator.itemgetter(1) es equivalente a lambda x: x[1] pero está implementado en C y se ejecuta más rápido en listas grandes.
operator.attrgetter — para objetos
import operator
class Student:
def __init__(self, name, grade):
self.name = name
self.grade = grade
def __repr__(self):
return f'Student({self.name!r}, {self.grade})'
students = [Student('Charlie', 85), Student('Alice', 92), Student('Bob', 78)]
print(sorted(students, key=operator.attrgetter('grade')))
# [Student('Bob', 78), Student('Charlie', 85), Student('Alice', 92)]Ordenación por múltiples claves
Devuelve una tupla desde la función key para ordenar por múltiples criterios. Python compara las tuplas elemento a elemento, por lo que los empates en la primera clave pasan a la segunda.
# Sort by grade ascending, then by name alphabetically when grades tie
data = [('Alice', 85), ('Bob', 92), ('Charlie', 85), ('Dave', 78)]
result = sorted(data, key=lambda x: (x[1], x[0]))
print(result)
# [('Dave', 78), ('Alice', 85), ('Charlie', 85), ('Bob', 92)]Alice y Charlie tienen ambos la nota 85, por lo que se ordenan alfabéticamente: Alice antes que Charlie.
Estabilidad de la ordenación
La ordenación de Python es estable: los elementos que resultan iguales mantienen su orden relativo original. Esto significa que puedes ordenar una lista por una clave, luego ordenar el resultado por otra clave, y el orden de la primera ordenación se preserva dentro de los empates de la segunda.
# Sort by grade, then (stably) by name — same result as the tuple key above
data = [('Alice', 85), ('Bob', 92), ('Charlie', 85), ('Dave', 78)]
step1 = sorted(data, key=lambda x: x[0]) # sort by name first
step2 = sorted(step1, key=lambda x: x[1]) # then sort by grade
print(step2)
# [('Dave', 78), ('Alice', 85), ('Charlie', 85), ('Bob', 92)]Esta técnica — llamada transformada de Schwartzian — a veces resulta más legible que una clave compuesta.
Conclusión
sorted() y list.sort() de Python te ofrecen una ordenación de listas rápida y flexible con código mínimo. Usa sorted() cuando necesites una nueva lista o estés ordenando un iterable que no sea una lista; usa list.sort() cuando quieras modificar una lista en su lugar. El parámetro key maneja casi cualquier criterio de ordenación, desde ordenar por longitud o un campo de diccionario hasta comparaciones sin distinción de mayúsculas. Para conjuntos de datos grandes, prefiere operator.itemgetter o operator.attrgetter en lugar de lambda para un mejor rendimiento.
Lectura relacionada:
- Python Lists — creación, indexación y segmentación de listas
- List Methods — referencia completa de los métodos de lista
- List Comprehension — construcción concisa de listas
- Loop Lists — iteración sobre listas