Ordenamiento de listas en Python
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!