用于固定长度FIFO的Python数据类型

时间:2009-12-19 01:14:10

标签: python

我想知道Python中是否存在一个本机数据类型,其作用类似于固定长度的FIFO缓冲区。例如,我想创建一个使用全零初始化的长度为5的FIFO缓冲区。然后,它可能看起来像这样:

[0,0,0,0,0]

然后,当我在对象上调用put函数时,它将移出最后一个零并将新值(比如1)放入左侧:

[1,0,0,0,0]

如果我放了一个2,它就会转移并看起来像这样:

[2,1,0,0,0]

......等等。新值出现在前面,最旧值出现偏移。我知道这很容易实现自己,但我想尽可能使用本机python数据类型。有谁知道哪种数据类型最适合这个?

4 个答案:

答案 0 :(得分:66)

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

有关collections.deque的更多信息,请参阅the docs;您调用push的方法实际上在该类型中称为appendleft

在Python 2.6中添加了第二个参数(maxlen,给出了最大长度);如果您使用的是旧版本的Python,则无法使用。

答案 1 :(得分:11)

您也可以使用列表

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 :(得分:2)

这篇文章还有一个例子

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'])

答案 3 :(得分:0)


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

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

印刷品:

[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]