Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
固定长度FIFO的Python数据类型_Python - Fatal编程技术网

固定长度FIFO的Python数据类型

固定长度FIFO的Python数据类型,python,Python,我想知道Python中是否有一个本机数据类型,其作用类似于固定长度的FIFO缓冲区。例如,我想创建一个长度为5的FIFO缓冲区,该缓冲区初始化为全零。然后,它可能看起来像这样: [0,0,0,0,0] 然后,当我调用对象上的put函数时,它将移离最后一个零,并将新值(例如1)放到左侧: [1,0,0,0,0] 如果我放一个2,它会移动,然后放成这样: [2,1,0,0,0] ……等等。新值移到最前面,最旧的值移到最前面。我知道这很容易自己实现,但如果可能的话,我希望使用本地python数据类型。

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

[0,0,0,0,0]

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

[1,0,0,0,0]

如果我放一个2,它会移动,然后放成这样:

[2,1,0,0,0]

……等等。新值移到最前面,最旧的值移到最前面。我知道这很容易自己实现,但如果可能的话,我希望使用本地python数据类型。有人知道哪种数据类型最适合这种情况吗

x = collections.deque(5*[0], 5)
有关集合的更多信息,请参阅;在该类型中,您调用的
push
方法实际上被称为
appendleft


Python 2.6中添加了第二个参数(
maxlen
,给出了最大长度);如果您使用的是较旧版本的Python,它将不可用。

这篇文章再举一个例子

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'])
您还可以使用列表

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]

-1不建议这样做。由于不推荐阅读docs@toom,您只需要了解使用列表的惩罚。为了简单起见,列表很难被击败。这是一个糟糕的解决方案。我使用一个包含固定数量元素和索引计数器的列表来实现它。-1第一个示例不是FIFO,而是LIFO。第二个例子是FIFO,虽然它的速度非常慢,不推荐使用。collections.deque是一个速度更快的集合,appendleft的复杂度为O(1),而不是list.seek(0,1),它的复杂度等于list length。为什么要使用pop而不是maxlen?这不是本例中的情况,但您可能希望捕获从缓冲区脱落的项。为此,请使用pop:
fall_off=d.pop();d、 附录左(新)