为什么 python 双端队列使用可迭代中的最后 maxlen 项进行初始化?

问题描述 投票:0回答:5

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

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

我预计 d 将包含 [1,2,3]。但我得到的是:

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

这不是违反直觉吗?

python deque
5个回答
32
投票

来自文档

一旦有界长度双端队列已满,当添加新项目时, 相应数量的物品从另一端被丢弃。 有界长度双端队列提供类似于尾部过滤器的功能 在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)

4
投票

官方文档明确提到了这一点:

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


1
投票

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


0
投票

一点也不,来自文档:

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

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


0
投票

回复晚了好几年,但听起来你好像在质疑

deque
返回
[4, 5, 6]
的设计决策,而不是使用
[1, 2, 3]
初始化时的
maxlen
3。

我不知道为什么会做出这样的选择,但我可以推测一个原因:

一位教授在 Google 录制的关于软件设计哲学的演讲。他讨论的想法之一是最常见的用例应该是最容易实现的。

考虑到这一理念,由于大多数程序员使用

deque
作为队列,我希望
deque
默认情况下表现得像队列,并且当给出的值超过
maxlen
时从另一端弹出。

希望这个答案能提供一些观点。

© www.soinside.com 2019 - 2024. All rights reserved.