Ordenar listas en Python: sort() vs sorted()

1. Introducción

Python se usa ampliamente como un lenguaje de programación simple e intuitivo. Dentro de ello, la «ordenación de listas» es una de las operaciones básicas y más frecuentemente utilizadas. En este artículo, explicaremos detalladamente los métodos de ordenación de listas en Python, y también presentaremos formas de personalización y consideraciones.

Al leer este artículo, incluso los principiantes podrán comprender cómo ordenar listas de manera eficiente y podrán aplicar ese conocimiento en programas reales.

2. Métodos de ordenación de listas

Python tiene principalmente dos métodos de ordenación. Veamos sus características y cómo usarlos.

2.1 Ordenación usando el método sort()

sort() es un método disponible en los objetos lista, ordena la lista original directamente. Por defecto se ordena en orden ascendente (de menor a mayor), pero si se especifica reverse=True, se ordena en orden descendente (de mayor a menor).

Uso básico

numbers = [3, 1, 4, 1, 5]
numbers.sort()
print(numbers)  # Salida: [1, 1, 3, 4, 5]

Cuando se ordena en forma descendente

numbers = [3, 1, 4, 1, 5]
numbers.sort(reverse=True)
print(numbers)  # Salida: [5, 4, 3, 1, 1]

2.2 Ordenación usando la función sorted()

sorted() devuelve una nueva lista ordenada sin modificar la lista original. También por defecto es ascendente, y si se usa reverse=True se puede obtener orden descendente.

Uso básico

numbers = [3, 1, 4, 1, 5]
sorted_numbers = sorted(numbers)
print(sorted_numbers)  # Salida: [1, 1, 3, 4, 5]
print(numbers)  # Salida: [3, 1, 4, 1, 5] La lista original no se modifica

Orden descendente

numbers = [3, 1, 4, 1, 5]
sorted_numbers = sorted(numbers, reverse=True)
print(sorted_numbers)  # Salida: [5, 4, 3, 1, 1]
侍エンジニア塾

3. Personalización de la ordenación

En Python, es posible usar el argumento key para ordenamiento personalizado. Resulta útil cuando se desea reordenar una lista con reglas propias.

3.1 Ordenación usando el argumento key

Ordenar por longitud de cadena

Si los elementos de la lista son cadenas, al especificar la función len en key, la ordenación se basa en la longitud de las cadenas.

words = ['banana', 'apple', 'cherry', 'date']
words.sort(key=len)
print(words)  # ['date', 'apple', 'banana', 'cherry']

3.2 Ordenar una lista de diccionarios

Al ordenar una lista que contiene diccionarios, se puede usar la función lambda en el argumento key para ordenar según una clave específica.

Ordenar por valores numéricos dentro del diccionario

fruits = [
    {'name': 'apple', 'price': 100},
    {'name': 'banana', 'price': 50},
    {'name': 'cherry', 'price': 150}
]

fruits.sort(key=lambda x: x['price'])
print(fruits)
# [{'name': 'banana', 'price': 50}, {'name': 'apple', 'price': 100}, {'name': 'cherry', 'price': 150}]

Ordenar con múltiples condiciones

Si los precios son iguales y se desea ordenar por nombre, se especifica una tupla en key.

fruits.sort(key=lambda x: (x['price'], x['name']))
print(fruits)
# [{'name': 'banana', 'price': 50}, {'name': 'apple', 'price': 100}, {'name': 'cherry', 'price': 150}]

4. Puntos a considerar al ordenar

4.1 Cuando se mezclan diferentes tipos de datos

Si la lista contiene números y cadenas mezclados, se producirá TypeError. Tenga cuidado.

mixed_list = [3, 'apple', 2]
mixed_list.sort()
# Salida: TypeError: '<' not supported between instances of 'str' and 'int'

Solución

Unifique los tipos de datos o use una ordenación personalizada.

mixed_list = [3, 'apple', 2]
mixed_list = [str(x) for x in mixed_list]
mixed_list.sort()
print(mixed_list)  # ['2', '3', 'apple']

4.2 Estabilidad de la ordenación

La ordenación en Python es «estable». Si hay valores idénticos, se conserva el orden original de la lista.

data = [(1, 'a'), (2, 'b'), (1, 'c')]
data.sort(key=lambda x: x[0])
print(data)  # [(1, 'a'), (1, 'c'), (2, 'b')]
年収訴求

5. TimSort: algoritmo de ordenación predeterminado de Python

En Python, se utiliza el algoritmo TimSort (TimSort) para ordenar listas. Es un algoritmo estable que combina merge sort y insertion sort.

Características de TimSort

  1. Ordenación estable: Se mantiene el orden de los elementos con el mismo valor.
  2. Procesamiento rápido: Es eficiente para conjuntos de datos reales y rápido en casos promedio.
  3. Rendimiento fuerte con datos parcialmente ordenados: El rendimiento mejora especialmente para datos que ya están parcialmente ordenados.

6. Comparación de rendimiento de sort() y sorted()

El método sort() y la función sorted() de Python tienen diferencias de comportamiento, por lo que también debemos comprender el rendimiento.

Diferencias básicas

Característicassort()sorted()
Objetivo de la operaciónModificar la lista originalCrear una nueva lista
Valor de retornoNinguno (devuelve None)Nueva lista ordenada
Caso de usoCuando está bien que la lista se modifiqueCuando se desea conservar la lista original

Comparación de rendimiento

sort() es ligeramente más rápido que sorted(). Esto se debe a que sort() ordena la lista directamente, por lo que no se genera costo adicional de memoria.

Ejemplo de benchmark

import time

numbers = [3, 1, 4, 1, 5] * 100000

# Medición de sort()
start = time.time()
numbers.sort()
end = time.time()
print("Tiempo de procesamiento de sort():", end - start)

# Medición de sorted()
numbers = [3, 1, 4, 1, 5] * 100000
start = time.time()
sorted_numbers = sorted(numbers)
end = time.time()
print("Tiempo de procesamiento de sorted():", end - start)

Por lo tanto, es importante seleccionar adecuadamente sort() y sorted() según el caso de uso.

7. Técnicas útiles para ordenar listas

Forma sencilla de ordenar en orden inverso

sort() y sorted() sin usar, también hay una forma de ordenar la lista en orden inverso.

numbers = [1, 2, 3, 4, 5]
reverse_numbers = numbers[::-1]
print(reverse_numbers)  # Salida: [5, 4, 3, 2, 1]

8. Errores comunes y solucionesTypeError: ‘<‘ not supported between instances

  • Causa: Cuando la lista contiene tipos de datos diferentes (por ejemplo, números y cadenas).
  • Solución: Unifique los tipos de datos o procese explícitamente con una ordenación personalizada.

Ejemplo

# Código que genera un error
mixed_list = [3, 'apple', 2]
mixed_list.sort()  # TypeError

# Solución
mixed_list = [str(x) for x in mixed_list]
mixed_list.sort()
print(mixed_list)  # ['2', '3', 'apple']

9. Preguntas frecuentes (FAQ)

Q1: sort() y sorted(), ¿cuál es la diferencia?

A:

  • sort() método: Ordena el contenido de la lista directamente. La lista original se modifica.
  • sorted() función: Devuelve una nueva lista ordenada. La lista original no se modifica.

Ejemplo

numbers = [3, 1, 4, 1, 5]

# caso de usar sort()
numbers.sort()
print(numbers)  # [1, 1, 3, 4, 5] - la lista original se modifica

# caso de usar sorted()
numbers = [3, 1, 4, 1, 5]
sorted_numbers = sorted(numbers)
print(sorted_numbers)  # [1, 1, 3, 4, 5]
print(numbers)  # [3, 1, 4, 1, 5] - la lista original no se modifica

Q2: ¿Cómo ordenar en orden descendente?

A:sort() método o sorted() función con reverse=True para ordenar en orden descendente. Ejemplo

numbers = [3, 1, 4, 1, 5]

# sort() para ordenar en orden descendente
numbers.sort(reverse=True)
print(numbers)  # [5, 4, 3, 1, 1]

# sorted() para ordenar en orden descendente
numbers = [3, 1, 4, 1, 5]
sorted_numbers = sorted(numbers, reverse=True)
print(sorted_numbers)  # [5, 4, 3, 1, 1]

Q3: ¿Qué es una ordenación personalizada? ¿Cómo se usa?

A:Una ordenación personalizada es un método para definir tú mismo el criterio de ordenación. key argumento se usa para especificar una función o una expresión lambda. Por ejemplo, puedes ordenar por la longitud de una cadena o por una clave específica de un diccionario. Ejemplo: ordenar por la longitud de la cadena

words = ['banana', 'apple', 'cherry', 'date']
words.sort(key=len)
print(words)  # ['date', 'apple', 'banana', 'cherry']

Q4: ¿Qué algoritmo de ordenación usa Python?

A:En Python se utiliza el algoritmo de ordenación TimSort (TimSort). Es una combinación de merge sort y insertion sort, y es eficiente para datos parcialmente ordenados.

Q5: ¿Hay formas de abordar la lentitud en la ordenación?

A:Cuando la lista tiene un número muy grande de elementos o se realiza una ordenación personalizada compleja, la velocidad de procesamiento puede disminuir. Se pueden mejorar con los siguientes métodos.

  1. Limitar la ordenación al mínimo necesario Evita ordenaciones innecesarias y procura ordenar solo una parte de los datos.
  2. heapq módulo Si utilizas el módulo heapq de la biblioteca estándar de Python, puedes realizar ordenaciones parciales (p. ej., obtener los N primeros) de manera eficiente.

Ejemplo: obtener los 3 valores superiores

import heapq

numbers = [5, 1, 8, 3, 2, 9]
top3 = heapq.nlargest(3, numbers)
print(top3)  # [9, 8, 5]