python

Python: ordenar arreglo especificando clave

En este post te mostraré cómo ordenar un arreglo o lista en Python especificando la clave de comparación. Es decir, ordenar un arreglo complejo especificando cómo comparar los valores para ordenarlos.

Esto también es conocido como ordenar una lista especificando una función de comparación o compare function, solo que presta atención, aquí vamos a especificar la clave, cosa que al final tendrá el mismo resultado para ordenar un arreglo de manera personalizada.

Ordenar lista con comparación personalizada

Para ordenar el arreglo con una comparación propia, invocamos a la función sorted. Esta función recibe la lista, y la devuelve ordenada.

Podemos especificar la función que devuelve el valor tomado en cuenta al ordenar, en el argumento key. La sintaxis básica es:

def funcion_que_devuelve_la_clave(elemento_del_arreglo):
  return valor_que_se_toma_al_ordenar

ordenada = sorted(desordenada, key=funcion_que_devuelve_la_clave)

A la función se le pasará el valor del arreglo, y nosotros debemos devolver cuál valor se toma en cuenta al ordenar. Vamos a ver un ejemplo.

Ejemplo: ordenar lista en Python con comparador propio

Primero tenemos nuestra lista de Python. Si te fijas, tiene diccionarios dentro de ella. Esto solo es para ejemplificar, ya que podría tener objetos, otros arreglos, etcétera.

juegos = [
    {
        "nombre": "Resident Evil 2",
        "calificacion": 99,
    },
    {
        "nombre": "Crash Bandicoot N. Sane Trilogy",
        "calificacion": 76,
    },

    {
        "nombre": "Cuphead",
        "calificacion": 100,
    },
    {
        "nombre": "Minecraft",
        "calificacion": 80,
    },
    {
        "nombre": "Bioshock",
        "calificacion": 95,
    },
]

En este caso cada juego tiene un nombre y una calificación. Entonces para ordenar por calificación debemos tomar en cuenta esa clave:

def funcion_que_devuelve_clave(juego):
    # Vamos a ordenar basándonos en su calificación, y como se nos
    # va a pasar un diccionario, devolvemos el elemento "calificacion"
    return juego["calificacion"]

Justo en esta función es en donde especificamos el orden. Si, por ejemplo, quisiéramos ordenar por nombre, sería:

return juego["nombre"]

Finalmente ordenamos la lista con sorted, especificando la función de comparación, que como lo dije, simplemente devuelve la clave:

# La ordenamos
juegos_ordenados = sorted(juegos, key=funcion_que_devuelve_clave)
print("Ordenada por calificación ascendente: ")
for juego in juegos_ordenados:
    print(juego)

Por cierto, también se puede ordenar en orden inverso:

# También se puede en orden inverso
juegos_ordenados = sorted(juegos, key=funcion_que_devuelve_clave, reverse=True)
print("Ordenada por calificación descendente: ")

for juego in juegos_ordenados:
    print(juego)

Poniendo todo junto

El código completo queda así:

"""
  ____          _____               _ _           _       
 |  _ \        |  __ \             (_) |         | |      
 | |_) |_   _  | |__) |_ _ _ __ _____| |__  _   _| |_ ___ 
 |  _ <| | | | |  ___/ _` | '__|_  / | '_ \| | | | __/ _ \
 | |_) | |_| | | |  | (_| | |   / /| | |_) | |_| | ||  __/
 |____/ \__, | |_|   \__,_|_|  /___|_|_.__/ \__, |\__\___|
         __/ |                               __/ |        
        |___/                               |___/         
    
____________________________________
/ Si necesitas ayuda, contáctame en \
\ https://parzibyte.me               /
 ------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
Creado por Parzibyte (https://parzibyte.me). Este encabezado debe mantenerse intacto,
excepto si este es un proyecto de un estudiante.
"""

juegos = [
    {
        "nombre": "Resident Evil 2",
        "calificacion": 99,
    },
    {
        "nombre": "Crash Bandicoot N. Sane Trilogy",
        "calificacion": 76,
    },

    {
        "nombre": "Cuphead",
        "calificacion": 100,
    },
    {
        "nombre": "Minecraft",
        "calificacion": 80,
    },
    {
        "nombre": "Bioshock",
        "calificacion": 95,
    },
]


def funcion_que_devuelve_clave(juego):
    # Vamos a ordenar basándonos en su calificación, y como se nos
    # va a pasar un diccionario, devolvemos el elemento "calificacion"
    return juego["calificacion"]


print("Originalmente es: ")
for juego in juegos:
    print(juego)

# La ordenamos
juegos_ordenados = sorted(juegos, key=funcion_que_devuelve_clave)
print("Ordenada por calificación ascendente: ")
for juego in juegos_ordenados:
    print(juego)

# También se puede en orden inverso
juegos_ordenados = sorted(juegos, key=funcion_que_devuelve_clave, reverse=True)
print("Ordenada por calificación descendente: ")

for juego in juegos_ordenados:
    print(juego)

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Servidor HTTP en Android con Flutter

El día de hoy te mostraré cómo crear un servidor HTTP (servidor web) en Android…

4 días hace

Imprimir automáticamente todos los PDF de una carpeta

En este post te voy a enseñar a designar una carpeta para imprimir todos los…

5 días hace

Guía para imprimir en plugin versión 1 desde Android

En este artículo te voy a enseñar la guía para imprimir en una impresora térmica…

1 semana hace

Añadir tasa de cambio en sistema de información

Hoy te voy a mostrar un ejemplo de programación para agregar un módulo de tasa…

2 semanas hace

Comprobar validez de licencia de plugin ESC POS

Los usuarios del plugin para impresoras térmicas pueden contratar licencias, y en ocasiones me han…

2 semanas hace

Imprimir euro € en impresora térmica

Hoy voy a enseñarte cómo imprimir el € en una impresora térmica. Vamos a ver…

4 semanas hace

Esta web usa cookies.