Colas en Python

Las colas en Python son objetos contenedores de tipo deque, están optimizados para realizar operaciones eficientes en ambas direcciones, como lo son añadir o eliminar elementos. Para crear una cola en Python requerimos importar la clase «deque» desde el paquete «collections», de la siguiente forma:

from collections import deque

A partir de aquí ya podemos crear colas en Python, el constructor tiene los siguientes parámetros opcionales:

deque(iterable, maxlen)

iterable: cualquier objeto que pueda ser recorrido por un bucle, tales como las listas, tuplas, strings o rangos. También son válidos los objetos diccionarios, pero solo serán tomadas las claves de cada elemento y no sus valores. Esto crea un objeto «deque» con elementos iniciales.

maxlen: es la longitud máxima de la cola o de elementos permitidos. Python va a descartar 1 elemento en el extremo opuesto por cada elemento añadido si se supera la longitud máxima.

Crear colas con elementos predeterminados

Para crear objetos de tipo deque, solo debemos proporcionar el argumento «iterable»:

Usando listas

Podemos usar un objeto lista:

lista = [1, 2, 3, 4, 5, 6, 7]
cola = deque(lista)

O simplemente un literal lista:

cola = deque([1, 2, 3, 4, 5, 6, 7])

Usando tuplas

Podemos usar un objeto tupla:

tupla = (1, 2, 3, 4, 5, 6, 7)
cola = deque(tupla)

O simplemente un literal tupla:

cola = deque((1, 2, 3, 4, 5, 6, 7))

Usando rangos

Usando un objeto de tipo range():

rango = range(1, 8)
cola = deque(rango)

O usando un literal range():

cola = deque(range(1, 8))

Todas las formas has aquí, van a crear un objeto de tipo deque, cuyos elemento iniciales son los números desde 1 hasta 7. Podemos recorrer el objeto usando el bucle for.

for i in cola:
    print(i, end=" ")

Y el resultado será el siguiente:

1 2 3 4 5 6 7

Usando strings (cadena de caracteres)

También podemos usar objetos de tipo string para crear colas, de la siguiente forma:

string = "Python es un gran lenguaje!!"
cola = deque(string)

O usando un literal string:

cola = deque("Python es un gran lenguaje!!")

Podemos recorrer la cola usando el bucle for como se hizo antes y el resultado sería el siguiente:

P y t h o n   e s   u n   g r a n   l e n g u a j e ! !

Usando diccionarios

También dije al inicio que los objetos diccionario son válidos, Pero hay diferencias con respecto a las formas vistas anteriormente.

Usando un objeto diccionario:

diccionario = {1: "Uno", 2: "Dos", 3: "Tres", 4: "Cuatro" , 5: "Cinco", 6: "Seis"}
cola = deque(diccionario)

O usando un literal diccionario:

cola = deque({1: "Uno", 2: "Dos", 3: "Tres", 4: "Cuatro" , 5: "Cinco", 6: "Seis"})

Hasta aquí vamos bien, pero hay un pequeño problema y es que la clase deque solo va a tomar las claves que hay en el diccionario y no los valores, así que si recorremos la cola con el bucle for:

for i in cola:
    print(i, end=" ")

Obtenemos como resultado los números del 1 al 6:

1 2 3 4 5 6

¿Se puede crear un objeto deque usando los valores del diccionario? La respuesta es -Sí-, de hecho se puede crear el objeto incluso con pares clave-valor entre «()».

Usando el método values():

El método values() nos devuelve una lista con todos los valores del diccionario.

cola = deque(diccionario.values())

Al recorrer la cola vamos a obtener el siguiente resultado:

Uno Dos Tres Cuatro Cinco Seis

Usando el método items():

El método items() nos devuelve una lista con los elementos agrupados en pares clave-valor entre ().

cola = deque(diccionario.items())

Si recorremos la cola, el resultado es el siguiente:

(1, 'Uno')
(2, 'Dos')
(3, 'Tres')
(4, 'Cuatro')
(5, 'Cinco')
(6, 'Seis')
Crear colas con tamaño fijo

Para crear colas de tamaño fijo, debemos proporcionar el argumento maxlen, ya sea…

Como único argumento:

cola = deque(maxlen=5)

O acompañado con el argumento iterable:

lista = [1, 2, 3, 4, 5, 6, 7]
cola = deque(lista, 5)

¿Esto tiene alguna ventaja o desventaja? Sí.

Ventaja: es muy eficiente y rápido a la hora de añadir o eliminar elementos en ambos extremos.

Desventaja: tenemos una restricción en el número de elemento que podemos añadir al objeto. Si recorremos la cola creada en el código anterior, vamos a obtener el siguiente resultado:

3 4 5 6 7

Los dos primeros elementos han sido descartados debido a que hemos superado la longitud máxima o cantidad máxima de elementos que el objeto puede tener.

Crear colas vacías

Esta es la forma más sencilla para crear colas, solo se requiere llamar a la clase deque sin argumentos.

cola = deque()

Las colas vacías no tienen restricciones en la cantidad de elementos que podemos añadir.

Métodos de los objetos deque

Las colas en Python son objetos, y como tal, tienen métodos que nos permite realizar diferentes labores. Los métodos que nos brinda la clase deque son los siguientes:

append(item): añade 1 elemento al final de la cola.

cola.append(2019)

appenleft(item): añade 1 elemento al inicio de la cola.

cola.appendleft(2018)

Ahora la cola tiene 2 elementos, este último añadido a la izquierda: [2018, 2019].

clear(): elimina todos los elementos.

cola.clear()

Ahora la cola está vacía: []

copy(): crea una nueva cola y realiza una copia superficial de todos los elementos.

cola.copy()

count(item): devuelve el número de elementos que son iguales a item.

cola.count(2018)

extend(iterable): extiende a la derecha la cola actual, añadiendo los elementos que hay en iterable.

cola.extend([2020, 2021, 2022])

Ahora tenemos 5 elementos: [2018, 2019, 2020, 2021, 2022]

extendleft(iterable): extiende a la izquierda la cola actual, añadiendo los elementos que hay en iterable.

cola.extendleft([2017, 2016, 2015])

Ahora tenemos 8 elementos: [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022]

index(item, start, end): devuelve el índice de item en la cola o un ValueError en caso de no encontrarlo.

cola.index(2021)

Nos devuelve el índice 6. Si queremos buscar el índice de un elemento en un rango determinado, debemos indicar los parámetro start y end; por ejemplo, desde desde el índice 2 hasta el 7.

cola.index(2021, 2, 7)

insert(index, item): inserta item en el indice index. Para el caso de una cola de tamaño fijo, este método genera un error IndexError si se añade un elemento que supere el tamaño máximo.

cola.insert(0, 2014)

Ahora la cola luce así: [2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022]

pop(): elimina y devuelve el último elemento de la cola, si no existe genera un IndexError.

cola.pop()

popleft(): elimina y devuelve el primer elemento de la cola, si no existe genera un IndexError.

cola.popleft()

remove(item): elimina a la primera ocurrencia de item, si no existe genera un ValueError.

cola.remove(2021)

reverse(): invierte los elementos afectando la cola actual.

cola.reverse()

La cola ahora lucen así: [2022, 2021, 2020, 2019, 2018, 2017, 2016, 2015, 2014]

rotate(n): gira la cola n pasos a la derecha o a la izquierda, afectando directamente al objeto.

Si n es positivo:

cola.rotate(3)

La cola ha girado 3 pasos a la derecha, desplazando los últimos 3 elementos a la izquierda, ahora lucen así: [2020, 2021, 2022, 2014, 2015, 2016, 2017, 2018, 2019].

Si n es negativo:

cola.rotate(-3)

La cola ha girado 3 pasos a la izquierda, desplazando los primeros 3 elementos a la derecha, ahora lucen así: [2017, 2018, 2019, 2020, 2021, 2022, 2014, 2015, 2016].

Añadir un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *