Ordenar Listas con Python
Este pequeño programa de 50 líneas de código ordena listas de mayor a menor o de menor a mayor según la opción que elija el usuario. Una lista en Python es un contenedor de elementos no ordenados de tamaño flexible que puede tener cualquier tipo de datos y puede expandirse o reducirse en tiempo de ejecución cuando se agregan o se eliminan elementos.
Código fuente
#!/usr/bin/env python # -*- coding: utf-8 -*- acumulado = [] valor = int(input("¿Cuantos valores desea ingresar?: ")) for xd in range(1, valor + 1): insert = int(input("Ingrese el valor #{0}: ".format(xd))) acumulado.append(insert) def ordenar_max(acumulado): for xd in range(len(acumulado)): for m in range(len(acumulado)): if acumulado[xd] > acumulado[m]: tmp = acumulado[xd] acumulado[xd] = acumulado[m] acumulado[m] = tmp print("Lista ordenada", end=": ") for lt in range(len(acumulado)): print(acumulado[lt], end=":") print("Fin!!") def ordenar_min(acumulado): for xd in range(len(acumulado)): for m in range(len(acumulado)): if acumulado[xd] < acumulado[m]: tmp = acumulado[m] acumulado[m] = acumulado[xd] acumulado[xd] = tmp print("Lista ordenada", end=": ") for lt in range(len(acumulado)): print(acumulado[lt], end=":") print("Fin!!") print(""" \nSelecciones una de las siguientes opciones ------------------------------------------ 1) Ordenar de mayor a menor 2) Ordenar de menor a mayor ------------------------------------------ """) selec = int(input("Selecciones una opción: ")) if selec == 1: ordenar_max(acumulado) elif selec == 2: ordenar_min(acumulado)
La primera línea es lo que se conoce en sistemas UNIX como Shebang, y permite ejecutar programas que requieren un intérprete, directamente sobre la línea de comandos sin necesidad de escribir el nombre del intérprete; por ejemplo, ./OrdenarListas.py en lugar de $python OrdenarListas.py. La segunda línea codifica el código en utf-8, esto nos garantiza que todo carácter acentuado se interprete de forma correcta.
Creando lista
acumulado = []
Creamos una lista vacía llamada acumulado. Así de sencillo se crean listas en Python.
Solicitando la cantidad y leyendo el valor
valor = int(input("¿Cuantos valores desea ingresar?: "))
Todo en una sola línea de código. Con la función input() le mostramos un mensaje en pantalla preguntando cuántos valores desea ingresar y espera esperamos a que el usuario ingrese el valor; una vez ingresado, lo convertimos a tipo int y lo asignamos a la variable valor.
Agregando elementos a la lista con el método .append()
for xd in range(1, valor + 1): insert = int(input("Ingrese el valor #{0}: ".format(xd))) acumulado.append(insert)
El bucle for va a iterar sobre un rango desde 1 hasta valor + 1 generado con la función range(), se hace de esta forma ya que los rangos en Python no tienen en cuenta el último valor. En la segunda línea se imprime un mensaje informando al usuario que ingrese un valor junto con el número de valores que va ingresando y lo leemos con la función input(); por último lo convertimos a tipo int y lo asignamos a la variable insert. En la última línea vamos agregando cada uno de los valores ingresados por el usuario usando el método append(), cuyo único argumentos es la variable que los contiene.
Función ordenar_max()
def ordenar_max(acumulado): for xd in range(len(acumulado)): for m in range(len(acumulado)): if acumulado[xd] > acumulado[m]: tmp = acumulado[xd] acumulado[xd] = acumulado[m] acumulado[m] = tmp print("Lista ordenada", end=": ") for lt in range(len(acumulado)): print(acumulado[lt], end=":") print("Fin!!")
La función ordenar_max() ordena los elementos de la lista de mayor a menor. Recibe como único argumento la lista que deseamos ordenar.
Bucle for + bucle for, ordenando la lista
for xd in range(len(acumulado)): for m in range(len(acumulado)): if acumulado[xd] > acumulado[m]: tmp = acumulado[xd] acumulado[xd] = acumulado[m] acumulado[m] = tmp
Ambos bucles van a iterar sobre un rango de números generados por la función range() basado en la longitud de la lista obtenida con la función len(), el rango va desde 0 hasta el valor de la longitud – 1. El bucle interno va a iterar desde 0 hasta N – 1 por cada elemento en la posición xd; por ejemplo, si hay 5 elemento en la lista, el bucle interno va a iterar 5 veces por cada elemento elemento en el índice xd, para un total de 25 iteraciones.
Sentencia if, evaluando elementos
if acumulado[xd] > acumulado[m]: tmp = acumulado[xd] acumulado[xd] = acumulado[m] acumulado[m] = tmp
Esta sentencia if va a evaluar si cada uno de los elementos del array ubicado en el índice xd es mayor a los elementos del array ubicado en el índice m, por eso el bucle interno va a iterar N cantidad de veces por cada elemento en el índice xd (como se explicó anteriormente) con la intención de evaluar si es mayor al elemento en el índice m. Si la condición es true, se realizan una serie de asignaciones que se explican a continuación:
* tmp = listNum[xd]
: el elemento en el índice xd es asignado a la variable tmp.
* listNum[xd] = listNum[m]
: el elemento ubicado en el índice m es asignado asignado en el índice xd.
* listNum[m] = tmp
: el elemento que había sido asignado a la variable tmp es asignado en el índice m.
Este pequeño proceso cambia de posición a los elementos, moviendo de índices a cada uno, para dejar a los números mayores al principio del array y dejado de últimas a los números menores.
Mostrando la lista ordenada
print("Lista ordenada", end=": ") for lt in range(len(acumulado)): print(acumulado[lt], end=":") print("Fin!!")
La función print() en la primera línea, solo va a imprimir el mensaje “Lista ordenada: “, el parámetro end=”: “ evita que se genere un salto de línea, pero además agrega el signo “:” y un espacio al final del mensaje.
Este bucle va a iterar sobre un rango de números generados con la función range() basado en la longitud de la lista obtenida con la función len(), el rango va desde 0 hasta el valor de la longitud – 1. La función print() en la línea #3 imprime cada uno de los elementos de la lista accediendo a ellos por su índice lt; el parámetro end=”:” se usa para evitar saltos de línea y como algo estético para que cada número se imprima de la siguiente forma: 15:13:8:3. La última función print() solo imprime la palabra “Fin!!”.
Función ordenar_min()
def ordenar_min(acumulado): for xd in range(len(acumulado)): for m in range(len(acumulado)): if acumulado[xd] < acumulado[m]: tmp = acumulado[m] acumulado[m] = acumulado[xd] acumulado[xd] = tmp print("Lista ordenada", end=": ") for lt in range(len(acumulado)): print(acumulado[lt], end=":") print("Fin!!"
Esta función tiene exactamente la misma estructura que la función ordenar_max() y de hecho funciona de la misma forma, solo hay un par de diferencias entre ambas que se encuentra en la sentencia if:
* La sentencia if de la función ordenar_max() evalúa si los elementos ubicados en el índice xd son mayores que los elementos ubicados en el índice m; mientras que en la función ordenar_min() se evalúa si los elementos en el índice xd son menores que los elementos en el índice m.
* En la función ordenar_max() la variable tmp toma el valor que hay en el índice xd del array; mientra que en la función ordenar_min() la variable tmp toma el valor que hay en el índice m.
* En la funciónordenar_max() el índice xd del array toma el valor del índice m del array; mientras que en la función ordenar_min() el índice m toma el valor del índice xd.
* En la funciónordenar_max() el índice m del array toma el valor de la variable tmp; mientras que en la función ordenar_min() el índice xd toma el valor de la variable tmp.
Seleccionando opción y mostrando resultados
print(""" \nSelecciones una de las siguientes opciones ------------------------------------------ 1) Ordenar de mayor a menor 2) Ordenar de menor a mayor ------------------------------------------ """) selec = int(input("Selecciones una opción: ")) if selec == 1: ordenar_max(acumulado) elif selec == 2: ordenar_min(acumulado)
La función print() solo nos muestra algo como esto:
Selecciones una de las siguientes opciones ------------------------------------------ 1) Ordenar de mayor a menor 2) Ordenar de menor a mayor ------------------------------------------
Un pequeño menú que le indica al usuario que seleccione alguna de las dos opciones presentes, ingresar el número 1 si desea ordenar el array de mayor a menor o el número 2 si lo desea ordenar de menor a mayor.
Leyendo opción
selec = int(input("Selecciones una opción: "))
Solicitamos al usuario que escoja una opción y la leemos con la función input(), por último la convertimos a tipo int con la función int() y asignamos el valor a la variable select. La sentencia if evalúa a la variable select y dependiendo de la opción escogida, entonces llama a la función ordenar_max() u ordenar_min() que recibe recibe como único parámetro el array a ordenar.
Ejecutando el programa
Al ejecutar este pequeño programa nos da un resultado similar al siguiente:
[fixedtorres@linuxero]$ python OrdenarListas.py ¿Cuantos valores desea ingresar?: 5 Ingrese el valor #1: 25 Ingrese el valor #2: 435 Ingrese el valor #3: 123 Ingrese el valor #4: 564 Ingrese el valor #5: 71 Selecciones una de las siguientes opciones ------------------------------------------ 1) Ordenar de mayor a menor 2) Ordenar de menor a mayor ------------------------------------------ Selecciones una opción: 1 Lista ordenada: 564:435:123:71:25:Fin!! [fixedtorres@linuxero]$
Una lista ordenada de mayor a menor si seleccionamos la opción #1.
Método .sort(), una forma mucho más corta
#!/usr/bin/env python # -*- coding: utf-8 -*- acumulado = [] valor = int(input("¿Cuantos valores desea ingresar?: ")) for xd in range(1, valor + 1): insert = int(input("Ingrese el valor #{0}: ".format(xd))) acumulado.append(insert) print(""" \nSelecciones una de las siguientes opciones ------------------------------------------ 1) Ordenar de mayor a menor 2) Ordenar de menor a mayor ------------------------------------------ """) selec = int(input("Selecciones una opción: ")) if selec == 1: acumulado.sort(reverse = True) print("\nLista ordenada: {}".format(acumulado)) elif selec == 2: acumulado.sort() print("\nLista ordenada: {}".format(acumulado))
Python tiene un método especial para ordenar elementos de las listas de forma rápida y nos permite reducir nuestro código drásticamente hasta en en un 50%. El método .sort() tiene un argumento nombrado que se llama reverse y cuyo único valor es True o False, dependiendo si queremos ordenar la lista de mayor a menor o de menor a mayor; pero el valor por defecto es False, lo que indica que la lista siempre se ordena de menor a mayor.