Pilas y colas en Python
Las listas son un tipo de objeto mutable de Python. Por mutable, en Python se entiende que el objeto es modificable una vez definido, por ejemplo:
(definimos la lista a con dos elementos)
(añadimos otro elemento)
[1, 2, 3]
A diferencia de las tuplas, que no son modificables:
(definimos la tupla b, que se quedará así por los siglos de los siglos…)
(…o hasta que pase el recolector de basura)
Las listas por ser mutables tienen definidas unas operaciones sobre ellas de las que las tuplas carecen, por ejemplo el método append(<elemento>) que se ha visto antes, o por ejemplo los siguientes métodos:
>>> c
['a', 'b', 'c']
>>> c.insert(0,”d”)
>>> c
['d', 'a', 'b', 'c']
>>> c.insert(2,”e”)
>>> c
['d', 'a', 'e', 'b', 'c']
>>> c.pop()
‘c’
>>> c
['d', 'a', 'e', 'b']
>>>
Como se puede apreciar pop() toma el último elemento (, o c[len(c)-1], como se prefiera), lo saca de la lista (la lista se queda sin ese valor) y nos lo devuelve. Junto con append() es lo justo para crear una pila:
(creamos la pila, vacía)
(sacamos datos de una pila vacía, y nos dan una excepción)
File “<stdin>”, line 1, in ?
IndexError: pop from empty list
>>> pila.append(1)
(añadimos datos a la pila)
>>> pila.append(3)
>>> pila
[1, 2, 3]
>>> while pila:
… print “Ultimo elemento de la pila: %d (pila: %s)” % (pila.pop(),pila)…
Ultimo elemento de la pila: 3 (pila: [1, 2])
Ultimo elemento de la pila: 2 (pila: [1])
Ultimo elemento de la pila: 1 (pila: [])
>>>
El otro método utilizado era insert(<posición>,<elemento>), que como creo que cabe esperar realiza este comportamiento:
(creamos la lista)
(insertamos en la posición 1, pero como está vacía realmente queda en la posición lista[0])
['a']
>>> lista.insert(5,”a”)
(insertamos en la posición 5, pero como está vacía realmente queda en la posición lista[1])
['a', 'a']
>>> lista.insert(0,”b”)
(insertamos al principio)
['b', 'a', 'a']
>>> lista.insert(-1,”c”)
(insertamos justo antes de la última posición)
['b', 'a', 'c', 'a']
>>> lista.insert(-2,”d”)
(insertamos en la antepenúltima posición)
['b', 'a', 'd', 'c', 'a']
>>>
¿Y para insertar en la última posición? lista.append(‘u’), mismamente:
>>> lista
['b', 'a', 'd', 'c', 'a', 'u']
>>>
Ahora ya crear una cola es coser y cantar, a base de insert(0,<elemento>) y pop():
(crear la cola)
(sacar de una cola vacía nos da una excepción
, como en la pila)
File “<stdin>”, line 1, in ?
IndexError: pop from empty list
>>> cola.insert(0,”1″) (
introducimos datos)
>>> cola.insert(0,”3″)
>>> cola
['3', '2', '1']
>>> while cola:
(y vamos sacando…)
…
Cabeza de la cola: 1 (cola: ['3', '2'])
Cabeza de la cola: 2 (cola: ['3'])
Cabeza de la cola: 3 (cola: [])
>>>
¿Cuánto tiempo nos podemos ahorrar por programarlo en Python en vez de en C?
Aunque también es mucho más ineficiente ejecutarlo en Python que en C, pero normalmente es preferible ahorrar tiempo de programación que tiempo de ejecución: mi tiempo es importante, el del microprocesador no tanto.