Тип данных Python для FIFO фиксированной длины - PullRequest
42 голосов
/ 19 декабря 2009

Я хотел бы знать, существует ли в Python собственный тип данных, который действует как буфер FIFO фиксированной длины. Например, я хочу создать буфер FIFO длиной 5, который инициализируется всеми нулями. Тогда это может выглядеть так:

[0,0,0,0,0]

Затем, когда я вызову функцию put для объекта, он сместится с последнего нуля и поместит новое значение, скажем 1, в левую сторону:

[1,0,0,0,0]

Если бы я поставил 2, то он сдвинулся бы и выглядел бы так:

[2,1,0,0,0]

... и так далее. Новое значение идет впереди, а самое старое смещается. Я понимаю, что это было бы очень легко реализовать самостоятельно, но я бы хотел использовать нативные типы данных Python, если это вообще возможно. Кто-нибудь знает, какой тип данных будет лучше для этого?

Ответы [ 3 ]

68 голосов
/ 19 декабря 2009
x = collections.deque(5*[0], 5)

См. документы для получения дополнительной информации о collections.deque; метод, который вы вызываете push, на самом деле называется appendleft в этом типе.

Второй параметр (maxlen, указывающий максимальную длину) был добавлен в Python 2.6; если вы используете более старые версии Python, он не будет доступен.

11 голосов
/ 27 октября 2011

Вы также можете использовать список

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]
2 голосов
/ 04 марта 2011

Еще один пример к этому сообщению

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'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...