2009-12-19 12 views
23

Me gustaría saber si hay un tipo de datos nativo en Python que actúa como un búfer FIFO de longitud fija. Por ejemplo, quiero crear un búfer FIFO de longitud 5 que se inicialice con todos los ceros. Entonces, podría tener este aspecto:Python Tipo de datos para una FIFO de longitud fija

[0,0,0,0,0]

Entonces, cuando llamo a la función de venta sobre el objeto, éste se desplazará fuera el último cero y poner el nuevo valor, por ejemplo 1, en el lado izquierdo:

[1,0,0,0,0]

Si pongo un 2, entonces se podría cambiar y poner a este aspecto:

[2,1,0,0,0]

... ys o encendido. El nuevo valor va al frente y el más antiguo se desplaza. Entiendo que esto sería muy fácil de implementar, pero me gustaría utilizar tipos de datos de python nativos si es posible. ¿Alguien sabe qué tipo de datos sería mejor para esto?

Respuesta

43
x = collections.deque(5*[0], 5) 

Ver the docs para más información sobre collections.deque; el método que llama al push en realidad se llama appendleft en ese tipo.

El segundo parámetro (maxlen, dando las longitudes máximas) se agregó en Python 2.6; si está utilizando versiones anteriores de Python, no estará disponible.

+0

Gracias. Eso es. – Doughy

2

Sólo un ejemplo más de este post

from collections import deque 

domains = ['1.com','2.com','3.com'] 
d = deque(domains)    
d.pop() #pop(delete) 3.com here 
d.appendleft('new.com') 


print d 

resultado:

+0

¿Por qué usa pop y no maxlen? –

7

también puede utilizar la lista

a = [0,0,0,0,0] 

a.pop(0) 
a.append(1) 

print a 
result [0,0,0,0,1] 

o para el lado izquierdo de la derecha, de lo contrario

a.pop(5) 
a.insert(0,1) 
print a 
result [1,0,0,0,0] 
+1

-1 Esto no es recomendable. Por alguna razón, lea los documentos http://docs.python.org/library/collections.html?highlight=collections.deque#collections.deque – toom

+3

@toom, no es recomendable, solo debe tener en cuenta la penalidad de usar listas. Para simplificar, una lista es difícil de superar. –

Cuestiones relacionadas