W3docs

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 lista
  • list.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.itemgetter como 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 ordenar
  • key — 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 en True para ordenar en orden descendente (por defecto: False)

Ordenar una lista de strings

python— editable, runs on the server

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

python— editable, runs on the server

Ordenar en orden descendente

python— editable, runs on the server

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 modified

Si 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()
DevuelveUna nueva lista ordenadaNone
Lista originalSin cambiosModificada en su lugar
Funciona conCualquier iterableSolo listas
MemoriaUsa memoria adicionalSin 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

python— editable, runs on the server

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 92

Para 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 78

Ordenació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:

Práctica

Práctica
Which of the following statements about sorted() and list.sort() are true?
Which of the following statements about sorted() and list.sort() are true?
Was this page helpful?