Тип данных Python для FIFO фиксированной длины
Я хотел бы знать, есть ли собственный тип данных в Python, который действует как FIFO-буфер фиксированной длины. Например, я хочу создать буфер FIFO длиной 5, который инициализируется всеми нулями. Тогда это может выглядеть так:
[0,0,0,0,0]
Затем, когда я вызываю функцию put на объект, он сдвигает последний ноль и помещает новое значение, например 1, в левую сторону:
[1,0,0,0,0]
Если я поставлю 2, он будет сдвигаться и выглядеть так:
[2,1,0,0,0]
... и так далее. Новое значение идет спереди, а самое старое - сбрасывается. Я понимаю, что это было бы очень легко реализовать самостоятельно, но я бы хотел использовать родные типы данных python, если это вообще возможно. Кто-нибудь знает, какой тип данных был бы лучше всего для этого?
Ответы
Ответ 1
x = collections.deque(5*[0], 5)
Подробнее о collections.deque
см. docs; метод, который вы вызываете push
, на самом деле называется appendleft
в этом типе.
В Python 2.6 добавлен второй параметр (maxlen
, дающий максимальную длину); если вы используете более старые версии Python, он не будет доступен.
Ответ 2
вы также можете использовать список
a = [0,0,0,0,0]
a.pop(0)
a.append(1)
print a
result [0,0,0,0,1]
или для левой стороны справа, в противном случае
a.pop(5)
a.insert(0,1)
print a
result [1,0,0,0,0]
Ответ 3
Еще один пример этого сообщения
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
результат:
deque(['new.com', '1.com', '2.com'])