ProgramaciónDesarrollador Backend

¿Cómo funciona el método sort() en listas en Python, cuál es la diferencia con la función sorted(), qué parámetros importantes hay, matices de uso y posibles trampas?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

Historia de la cuestión: El método sort() está integrado en el tipo list desde las primeras versiones de Python, mientras que la función sorted() apareció en Python 2.4. La ordenación de colecciones es una de las tareas más comunes en programación, y Python ofrece dos herramientas principales para resolverla.

Problema: Muchos principiantes confunden sort() (método de lista) y sorted() (función de alto nivel). No comprenden cuándo usar la ordenación in-place, qué objetos se pueden ordenar, cómo establecer un orden arbitrario a través de key/reverse, y a qué trampas posibles puede llevar esto, especialmente con estructuras de datos personalizadas complejas.

Solución:

  • list.sort() ordena la lista original in situ y devuelve None. Cambia el objeto original.
  • sorted() devuelve una nueva lista ordenada (o de otro tipo, si se pasa uno diferente), sin modificar el original. Funciona con cualquier objeto iterable (incluso generadores).
  • Ambos métodos admiten los parámetros key (función de ordenación) y reverse (bandera booleana para ordenar en orden inverso).

Ejemplo de código:

numbers = [5, 2, 9, 1] numbers.sort() # numbers = [1, 2, 5, 9] words = ['aaa', 'ZZZ', 'bbb'] sorted_words = sorted(words, key=str.lower, reverse=True) # sorted_words = ['ZZZ', 'bbb', 'aaa'] # words permanece sin cambios

Características clave:

  • sort() solo funciona para listas y ordena in-place, sorted() es más versátil — funciona con cualquier objeto iterable.
  • Personalización de la ordenación a través del parámetro key — es conveniente ordenar por lambda o atributo del objeto.
  • Es importante no confundir que sort devuelve None, lo que a menudo conduce a errores por asignaciones accidentales.

Preguntas engañosas.

¿Qué devolverá la variable si hacemos my_list = my_list.sort()?

Respuesta: my_list será None, porque sort ordena la lista in situ y devuelve None. Este es un error común: siempre ordene in-place sin asignación, o use sorted si necesita un objeto ordenado como nueva lista.

Ejemplo de código:

lst = [3, 1, 2] lst = lst.sort() # lst ahora es None

¿Se puede ordenar una tupla o una cadena con el método sort()?

Respuesta: No, los objetos inmutables (tuple, str) no tienen el método sort, pero se puede aplicar sorted(), que devuelve una nueva lista ordenada de los elementos.

Ejemplo de código:

tpl = (4, 2, 7) sorted_tpl = sorted(tpl) # sorted_tpl = [2, 4, 7]

¿Se puede ordenar una lista con elementos de diferentes tipos?

Respuesta: En Python 3, ordenar diferentes tipos no comparables (por ejemplo, int y str) genera TypeError. En Python 2 había un orden específico, ahora es necesario indicar explícitamente una función key para generalizar todos los valores a una forma comparable.

Errores típicos y anti-patrones

  • Confundieron el valor de retorno de sort/sorted — perdieron datos.
  • Intentar ordenar objetos de tipos no comparables sin key — recibirán una excepción.
  • Ordenar grandes colecciones in-place cuando se necesita el “original”.
  • Usar funciones key pesadas que ralentizan drásticamente la ordenación.

Ejemplo de la vida real

Caso negativo

Un programador hizo my_list = my_list.sort(), después de lo cual perdió el acceso a la lista original porque se asignó a None.

Pros:

  • La sintaxis parece "lógica" (para principiantes)

Contras:

  • Pérdida de acceso a los datos, es fácil no notar el error en proyectos grandes, fallo del programa en tiempo de ejecución.

Caso positivo

Usaron sorted() cuidadosamente para obtener una nueva versión sin modificar el original o aplicaron correctamente sort, sin hacer asignaciones.

Pros:

  • Comportamiento explícito, conservación de los datos originales.
  • Flexibilidad para objetos iterables (y no solo listas)

Contras:

  • Con sorted se crea una copia — más costosa en memoria para colecciones muy grandes.