Python Datatype for a fixed-length FIFO

Question:

I would like to know if there is a native datatype in Python that acts like a fixed-length FIFO buffer. For example, I want do create a length-5 FIFO buffer that is initialized with all zeros. Then, it might look like this:

[0,0,0,0,0]

Then, when I call the put function on the object, it will shift off the last zero and put the new value, say 1, into the left side:

[1,0,0,0,0]

If I put a 2, it would then shift and put to look like this:

[2,1,0,0,0]

…and so on. The new value goes at the front and the oldest one is shifted off. I understand that this would be very easy to implement myself, but I would like to use native python datatypes if at all possible. Does anyone know which datatype would be best for this?

Asked By: Doughy

||

Answers:

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

See the docs for more about collections.deque; the method you call push is actually called appendleft in that type.

The second parameter (maxlen, giving the maximum lengths) was added in Python 2.6; if you’re using older versions of Python, it won’t be available.

Answered By: Alex Martelli

Just one more example to this 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

result:

deque(['new.com', '1.com', '2.com'])
Answered By: derevo

you can also use list

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

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

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

or for left side in right out, otherwise

a.pop(5)
a.insert(0,1)
print a
result [1,0,0,0,0]
Answered By: Edo

test_queue = deque([0]*5,maxlen=5) 

for i in range(10):
    print(i)
    test_queue.appendleft(i)
    print(list(test_queue))

prints:

[0, 0, 0, 0, 0]
1
[1, 0, 0, 0, 0]
2
[2, 1, 0, 0, 0]
3
[3, 2, 1, 0, 0]
4
[4, 3, 2, 1, 0]
5
[5, 4, 3, 2, 1]
6
[6, 5, 4, 3, 2]
7
[7, 6, 5, 4, 3]
8
[8, 7, 6, 5, 4]
9
[9, 8, 7, 6, 5]
Answered By: YScharf
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.