我想知道Python中是否存在一个本机数据类型,其作用类似于固定长度的FIFO缓冲区。例如,我想创建一个使用全零初始化的长度为5的FIFO缓冲区。然后,它可能看起来像这样:
[0,0,0,0,0]
然后,当我在对象上调用put函数时,它将移出最后一个零并将新值(比如1)放入左侧:
[1,0,0,0,0]
如果我放了一个2,它就会转移并看起来像这样:
[2,1,0,0,0]
......等等。新值出现在前面,最旧值出现偏移。我知道这很容易实现自己,但我想尽可能使用本机python数据类型。有谁知道哪种数据类型最适合这个?
答案 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]