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

Dou*_*ghy 46 python

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

[0,0,0,0,0]

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

[1,0,0,0,0]

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

[2,1,0,0,0]

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

Ale*_*lli 74

x = collections.deque(5*[0], 5)
Run Code Online (Sandbox Code Playgroud)

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

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


小智 10

你也可以使用列表

a = [0,0,0,0,0]

a.pop(0)
a.append(1)

print a
result [0,0,0,0,1]
Run Code Online (Sandbox Code Playgroud)

或者右侧的左侧,否则

a.pop(5)
a.insert(0,1)
print a
result [1,0,0,0,0]
Run Code Online (Sandbox Code Playgroud)

  • @toom不是不推荐的,你只需要知道使用列表的惩罚.为简单起见,列表很难被击败. (3认同)
  • -1不建议这样做.为什么阅读文档http://docs.python.org/library/collections.html?highlight=collections.deque#collections.deque (2认同)

der*_*evo 7

这篇文章还有一个例子

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
Run Code Online (Sandbox Code Playgroud)

结果:

deque(['new.com', '1.com', '2.com'])
Run Code Online (Sandbox Code Playgroud)