Ordenamiento de listas en Python

Publicado por Andrea Navarro en

En este artículo veremos cómo ordenar listas en Python utilizando el método sort y cómo configurar los criterios de ordenamiento.

Método sort

El método sort es un método para listas que permite ordenar las mismas. El ordenamiento se realiza en la misma estructura eliminando el orden anterior. En consecuencia este método retorna None al ser ejecutado.

En el siguiente ejemplo se observa como se ordena una lista de números enteros

numeros = [123,53,6,12,153,43,16,25,109,7,12]
numeros.sort()
print(numeros)
#[6, 7, 12, 12, 16, 25, 43, 53, 109, 123, 153]

En el caso de cadenas de caracteres, estos se ordenan de manera alfabética:

nombres = ["Verónica","Amanda","Román","Estrella","Isidora","Araceli","Verónica","Norberto","Matilde"]
nombres.sort()
print(nombres)
#['Amanda', 'Araceli', 'Estrella', 'Isidora', 'Matilde', 'Norberto', 'Román', 'Verónica', 'Verónica']

Cuando se trabaja con valores booleanos siempre se ordenan primeros los valores falsos (equivalentes en otros lenguajes y formas de representación como 0) y luego los verdaderos

booleanos = [True, False,True,True,False,True,False,False]
booleanos.sort()
print(booleanos)
#[False, False, False, False, True, True, True, True]

Orden de listas inverso

Por defecto el ordenamiento con sort se realiza de manera ascendente. Para lograr un ordenamiento descendente es necesario colocar el argumento reverse con valor True.

numeros = [123,53,6,12,153,43,16,25,109,7,12]
numeros.sort(reverse = True)
print(numeros)
#[153, 123, 109, 53, 43, 25, 16, 12, 12, 7, 6]

Clave de ordenamiento

Es posible configurar diferentes tipos o criterios de ordenamiento de listas utilizando el argumento key. Este argumento permite ingresar una función o método que se utilizará como criterio de ordenamiento de los elementos.

En el siguiente ejemplo se utiliza el método len para especificar que el ordenamiento de los valores de la lista no estará dado en forma alfabética sino que dependerá de la longitud las cadenas. Como resultado el orden irá de las cadenas más cortas a las más largas.

nombres = ["Verónica","Amanda","Román","Estrella","Isidora","Ana","Verónica","Norberto","Matilde"]
nombres.sort(key=len)
print(nombres)
#['Ana', 'Román', 'Amanda', 'Isidora', 'Matilde', 'Verónica', 'Estrella', 'Verónica', 'Norberto']

Funciones de ordenamiento

En lugar de utilizar funciones pre-definidas puede crearse una función personalizada que determine el criterio de ordenamiento y pasarla como valor del argumento key.

Si se quiere que el ordenamiento de una lista de cadenas esté dado por la cantidad de vocales que tenga cada elemento entonces es necesario crear una función que reciba una cadena como argumento y retorne la cantidad de vocales existentes en la misma.

def cantidadVocales(cadena):
	nvocales=0
	for c in cadena:
		if c in "aeiouAEIOUáéíóú":
			nvocales = nvocales+1
	return nvocales

Una vez definida dicha función se la asigna al argumento key:

nombres = ["Verónica","Amanda","Román","Estrella","Isidora","Ana","Verónica","Norberto","Matilde"]
nombres.sort(key=cantidadVocales)
print(nombres)
#['Román', 'Ana', 'Amanda', 'Estrella', 'Norberto', 'Matilde', 'Verónica', 'Isidora', 'Verónica']

Listas de diccionarios

En el caso de tener una lista de diccionario que comparten claves puede especificarse el valor por el cuál ordenar la lista haciendo uso de la función lambda.

En el siguiente ejemplo se especifica que el valor utilizado para ordenar de cada elemento corresponde al valor de la clave edad.

diccionario = [{"nombre":"Verónica", "edad":42},
                {"nombre":"Amanda", "edad":22},
                {"nombre":"Román", "edad":31},
                {"nombre":"Isidora", "edad":53},
                {"nombre":"Norberto", "edad":38},
                {"nombre":"Araceli", "edad":32}]
diccionario.sort(key=lambda item: item["edad"])
print(diccionario)
#[{'nombre': 'Amanda', 'edad': 22}, {'nombre': 'Román', 'edad': 31}, {'nombre': 'Araceli', 'edad': 32}, {'nombre': 'Norberto', 'edad': 38}, {'nombre': 'Verónica', 'edad': 42}, {'nombre': 'Isidora', 'edad': 53}]

Lista de tuplas

De manera similar puede utilizarse la función lambda para especificar la posición del elemento que se utilizará para el ordenamiento en una lista de tuplas. En este ejemplo la posición 1 corresponde a las edades.

tupla = [
    ("Verónica", 42),
	("Amanda", 22),
	("Román", 31),
	("Isidora",53),
]
tupla.sort(key=lambda item: item[1])
print(tupla)
#[('Amanda', 22), ('Román', 31), ('Verónica', 42), ('Isidora', 53)]

Listas de objetos

En el caso de una lista de objetos es necesario especificar el atributo que será utilizado como clave de ordenamiento en la función lambda:

class Persona:
    def __init__(self, nombre, apellido):
        self.nombre = nombre
        self.apellido = apellido
    def __repr__(self):
        return repr((self.nombre, self.apellido))
        
personas = [
    Persona('Verónica', 'Perez'),
    Persona('Amanda', 'Gonzales'),
    Persona('Román', 'Moreno'),
    Persona('Isidora', 'Moreno'),
    Persona('Norberto', 'Aguila'),
    Persona('Araceli', 'Torres'),
]

personas.sort(key=lambda persona: persona.apellido)
print(personas)
# [('Norberto', 'Aguila'), ('Amanda', 'Gonzales'), ('Román', 'Moreno'), ('Isidora', 'Moreno'), ('Verónica', 'Perez'), ('Araceli', 'Torres')]

En este artículo hemos visto cómo utilizar el método sort para el ordenamiento de listas con diferentes tipos de valores y estructuras incluyendo diccionarios, tuplas y objetos. También hemos visto como utilizar el argumento key para personalizar los criterios de ordenamiento. Espero que les sirva!


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!


Andrea Navarro

- Ingeniera en Informática - Docente universitaria - Investigadora