11

我正在学习如何使用双端队列。这是我所做的:

>>> d = deque([1,2,3,4,5,6], maxlen=3)

我预计 d 将包含 [1,2,3]。但相反,我得到了:

>>> d
deque([4, 5, 6], maxlen=3)

这不是违反直觉吗?

4

4 回答 4

22

来自文档

一旦有界长度的双端队列已满,当添加新项目时,相应数量的项目将从另一端丢弃。有界长度双端队列提供类似于 Unix 中的尾过滤器的功能。它们还可用于跟踪仅关注最近活动的事务和其他数据池。

因此,您的代码相当于:

>>> from collections import deque
>>> d = deque(maxlen=3)
>>> for i in range(1, 7):
...     d.append(i)
...     print d
...     
deque([1], maxlen=3)
deque([1, 2], maxlen=3)
deque([1, 2, 3], maxlen=3)
deque([2, 3, 4], maxlen=3)
deque([3, 4, 5], maxlen=3)
deque([4, 5, 6], maxlen=3)
于 2013-11-01T08:49:56.613 回答
3

官方文档清楚地提到了这一点:

一旦有界长度的双端队列已满,当添加新项目时,相应数量的项目将从另一端丢弃。

于 2013-11-01T08:50:12.467 回答
1

根本不是,来自文档:

“返回一个新的从左到右初始化的双端队列对象(使用 append()),其中包含来自可迭代的数据”

我主要使用双端队列对象作为最新项目的缓冲区。例如,所有用户都会执行 100 次操作。

于 2013-11-01T08:48:09.567 回答
1

这是一个设计决定。将最近的元素保留在队列中更为实用。年长的只是从另一端弹出来。

于 2013-11-01T08:48:34.163 回答