当前位置: 首页 > 面试题库 >

如何切片双端队列?[重复]

朱翔
2023-03-14
问题内容

这个问题已经在这里有了答案

将切片符号与collections.deque一起使用 (6个答案)

6年前关闭。

我已将一些使用列表的代码更改为使用双端队列。我不能再切入它,因为出现错误:

TypeError:序列索引必须是整数,而不是’slice’

这是显示问题的REPL。

>>> import collections
>>> d = collections.deque()
>>> for i in range(3):
...     d.append(i)
...
>>> d
deque([0, 1, 2])
>>> d[2:]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence index must be integer, not 'slice'

那么,是否有一种变通方法来支持在Python中切片为双端队列?


问题答案:

尝试itertools.islice()

 deque_slice = collections.deque(itertools.islice(my_deque, 10, 20))

索引到adeque要求每次都从头开始跟踪链接列表,因此islice(),跳过项以到达切片的开头的方法将提供最佳的性能(比将其编码为每个元素的索引操作更好)。

您可以轻松编写一个deque子类,为您自动完成此操作。

class sliceable_deque(collections.deque):
    def __getitem__(self, index):
        if isinstance(index, slice):
            return type(self)(itertools.islice(self, index.start,
                                               index.stop, index.step))
        return collections.deque.__getitem__(self, index)

请注意,您不能将负索引或步进值与一起使用islice。可以对此进行编码,如果您采用子类方法,则可能值得这样做。对于负向启动或停止,您可以添加双端队列的长度;对于消极步骤,您需要在其中reversed()放置一个。我将其保留为练习。:-)

deque通过if切片测试,从中检索单个项目的性能将稍有下降。如果这是一个问题,则可以使用EAFP模式进行某种程度的改进-
以由于需要处理异常而使切片路径的性能稍差为代价:

class sliceable_deque(collections.deque):
    def __getitem__(self, index):
        try:
            return collections.deque.__getitem__(self, index)
        except TypeError:
            return type(self)(itertools.islice(self, index.start,
                                               index.stop, index.step))

与常规的相比,当然还有一个额外的函数调用deque,因此,如果您真的在乎性能,那么您真的想添加一个单独的slice()方法或类似方法。



 类似资料:
  • queue 在java5中新增加了java.util.Queue接口,用以支持队列的常见操作。该接口扩展了java.util.Collection接口。除了基本的 Collection 操作外,队列还提供其他的插入、提取和检查操作。 每个方法都存在两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(null 或 false,具体取决于操作)。 抛出异常 返回特殊值 插入 add

  • 双端队列(Double-ended Queue) 注:队列是一种只允许在一端删除而在另一端插入的数据结构。双端队列(Deque)是队列的一种拓展,它可以在队列的两端进行插入和删除。 1. 双端队列(Deque)的概念 1.1 双端队列的定义 双端队列是限定插入和删除操作在表的两端进行的线性表,是一种具有队列和栈的性质的数据结构。 1.2 双端队列的特点 双端队列中的元素可以从两端进队和出队,其限定

  • 问题内容: 我最近开始研究如何在Python中实现各种数据结构,以使我的代码更高效。在研究列表和双端队列的工作方式时,我发现,我想转移和取消移位,可以将列表中的O(n)减少到双端队列的O(1)的时间(列表实现为具有每次在前面插入东西时都可以完全复制,等等。)。我似乎找不到关于如何实现双端队列的细节,以及其缺点与列表的细节。有人可以启发我解决这两个问题吗? 问题答案: https://github.

  • 问题内容: 如何在Python中检查双端队列是否为空? 问题答案: 如果是您的双端队列,请使用 如果双端队列包含任何项目并且为空,则将隐式转换为。

  • 本文向大家介绍Python Deque双端队列操作方法,包括了Python Deque双端队列操作方法的使用技巧和注意事项,需要的朋友参考一下 在Python中,双端队列是一种数据结构,例如堆栈和队列。它允许从队列的两端进行追加和弹出操作。这使其与其余数据结构不同。下面列出了适用于双端队列的各种操作。在本文中,我们将看到每个操作的示例。该集合模块用于实现双端队列。 双端队列操作 以下是使用双端队列

  • 主要内容:1 LinkedBlockingDeque的概述,2 LinkedBlockingDeque的原理,2.1 主要属性,2.2 构造器,2.3 入队操作,2.4 出队操作,2.5 检查操作,2.6 size操作,2.7 迭代操作,3 LinkedBlockingDeque的总结基于JDK1.8详细介绍了LinkedBlockingDeque的底层源码实现,包括双端队列的入队列、出队列、迭代等操作源码。实际上LinkedBlockingDeque的源码还是非常简单的! 1 LinkedBl

  • 本文向大家介绍JS中队列和双端队列实现及应用详解,包括了JS中队列和双端队列实现及应用详解的使用技巧和注意事项,需要的朋友参考一下 队列 队列 双端队列数据结构 应用 用击鼓传花游戏模拟循环队列 用双端对列检查一个词是否构成回文 生成 1 到 n 的二进制数 队列和双端队列 队列遵循先进后出(FIFO, 也称为先来先服务) 原则的. 日常有很多这样场景: 排队购票、银行排队等. 由对列的特性,银行

  • 我可以从pandas文档中看出,您可以: 对于时间序列,您为什么不能: 我得到一个语法错误。不能在时间序列上执行多个切片范围吗?有解决办法吗?