【问题标题】:Why is python deque initialized using the last maxlen items in an iterable?为什么使用可迭代中的最后一个 maxlen 项初始化 python deque?
【发布时间】:2013-11-12 11:00:49
【问题描述】:

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

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

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

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

这不是违反直觉吗?

【问题讨论】:

  • 如果您想要的是列表中的前三个值,请使用mylist[0:3]。如果你想对任何可迭代对象都一样,itertools.islice(iterable, 3)

标签: python deque


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      来自docs

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

        完全没有,来自文档:

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

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

        【讨论】:

        • 虽然我有足够的兴趣去检查它,而我正在使用的deque 的实现(Python 2.7.5)实际上并没有使用append()。如果我继承并覆盖 append 它不会改变初始化的行为。这是 Python 文档的一个微妙点——“使用append()”是“与为此类定义的append() 行为相同的效果”的简写,这并不意味着那里有定制点: -)
        猜你喜欢
        • 1970-01-01
        • 2019-07-24
        • 1970-01-01
        • 2010-11-18
        • 1970-01-01
        • 2019-12-28
        • 1970-01-01
        • 1970-01-01
        • 2012-05-17
        相关资源
        最近更新 更多