Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Datatype for a fixed-length FIFO

Tags:

python

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?

like image 864
Doughy Avatar asked Dec 19 '09 01:12

Doughy


People also ask

How do I create a fixed size list in Python?

You can use this: [None] * 10 . But this won't be "fixed size" you can still append, remove ... This is how lists are made. You could make it a tuple ( tuple([None] * 10) ) to fix its width, but again, you won't be able to change it (not in all cases, only if the items stored are mutable).

What is FIFO in Python?

In Python, a FIFO queue is a linear data structure. It stores objects in a first in first out (FIFO) manner. For example, you can use the Queue class from the queue module as a thread-safe FIFO queue: from queue import Queue.

What is LIFO in Python?

A stack is a linear data structure that stores items in a Last-In/First-Out (LIFO) or First-In/Last-Out (FILO) manner. In stack, a new element is added at one end and an element is removed from that end only. The insert and delete operations are often called push and pop.


4 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.

like image 50
Alex Martelli Avatar answered Sep 28 '22 21:09

Alex Martelli


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]
like image 21
Edo Avatar answered Sep 26 '22 21:09

Edo


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'])
like image 35
derevo Avatar answered Sep 28 '22 21:09

derevo



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]
like image 24
YScharf Avatar answered Sep 28 '22 21:09

YScharf