Python collections中的双向队列deque简单介绍详解

yizhihongxing

Python collections中的双向队列deque简单介绍详解

前言

在Python的collections模块中,deque是一个强大的数据结构,它可以帮助我们实现高效的队列和栈操作。deque是一个双向队列,因此支持从两端进行操作,其实现方式使得它比使用列表实现队列的方式更加高效。

使用方法

创建deque

在使用deque之前,首先需要导入collections模块:

from collections import deque

创建deque的方式有多种,可以使用空的deque:

d = deque()

也可以使用一个可迭代对象(例如列表)来创建deque:

d = deque([1, 2, 3])

添加元素

双向队列支持从头和尾部添加元素,分别使用appendleft和append方法。例如:

d.append(4)      # 从右端添加元素,d现在为deque([1, 2, 3, 4])
d.appendleft(0)  # 从左端添加元素,d现在为deque([0, 1, 2, 3, 4])

删除元素

双向队列同样支持从头和尾部删除元素,分别使用popleft和pop方法。例如:

d.pop()         # 从右端删除元素,d现在为deque([0, 1, 2, 3])
d.popleft()     # 从左端删除元素,d现在为deque([1, 2, 3])

获取元素

deque同样支持从头和尾部获取元素,分别使用index和reverse_index方法。例如:

d.index(1)           # 返回1的位置,即0
d.reverse_index(2)   # 返回2的位置,即1(因为deque是双向的)

其他操作

除了前面提到的操作之外,deque还支持以下几种操作:

  • rotate(n):将deque向右循环移动n步(如果n为负数则向左移动)。
  • clear():清空deque。
  • extend(iter):将可迭代对象中的元素加入deque,与列表的extend方法类似。
  • extendleft(iter):将可迭代对象中的元素从左端加入deque。

示例说明

基本队列

双向队列的最基本用法就是作为一个队列来使用,可以使用append和popleft方法实现队列的操作。例如:

q = deque()
q.append(1)
q.append(2)
print(q.popleft())  # output: 1
print(q.popleft())  # output: 2

实现一个滑动窗口

有时候我们需要维护一个滑动窗口,并在窗口中查找某个元素是否存在。使用deque可以非常方便地实现这个功能,例如:

def find_element_in_window(nums, window_size, target):
    window = deque(nums[:window_size], maxlen=window_size)
    for i in range(window_size, len(nums)):
        if target in window:
            return True
        window.append(nums[i])
    return target in window

nums = [1, 3, -1, -3, 5, 3, 6, 7]
print(find_element_in_window(nums, 3, 0))  # output: True
print(find_element_in_window(nums, 3, 5))  # output: True
print(find_element_in_window(nums, 3, 2))  # output: False

在上面的示例中,我们使用deque维护了一个长度为3的窗口,逐步向右移动并向窗口中添加元素。如果目标元素在窗口中,则返回True,否则在循环结束后再检查一次。注意,在创建deque时我们设置了maxlen参数,这意味着当deque长度超过maxlen时,最左边(最老的)的元素自动被删除,因此每次添加新元素时deque的长度始终为3。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python collections中的双向队列deque简单介绍详解 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • Python利用re模块实现简易分词(tokenization)

    Python利用re模块实现简易分词(tokenization) 在自然语言处理中,分词是一个非常重要的任务。分词的目的是将一段文本分成若干个词语,以便后续的处理。在本文中,我们将介绍如何使用Python的re模块实现简易分词。 re模块简介 re模块是Python中用于正则表达式操作的模块。正则表达式是一种用于匹配字符串的模式,可以用于字符串的搜索、替换、…

    python 2023年5月14日
    00
  • Python中的变量与常量

    以下是详细讲解“Python中的变量与常量”的完整攻略,包含两个示例说明。 1. 变量 在Python中,变量是用于储数据的标识符。变量可以存储不同类型的数据,例如整数、浮点数、字符串等。在Python中,变量的值随时更改。 以下是一个使用变量的示例: x = 5 y = "Hello, World!" print(x) print(y)…

    python 2023年5月14日
    00
  • Python中的numpy.diff()函数

    本文将为你详细讲解Python中的numpy.diff()函数。 一、numpy.diff()函数概述 numpy.diff()函数是numpy库中的一个函数,用于计算数组中相邻元素的差值。具体来说,它可以计算一维、多维数组中相邻元素的差值,并返回一个差异值数组。这个函数在数据处理和信号处理中经常使用。 二、numpy.diff()函数的语法 numpy.d…

    python-answer 2023年3月25日
    00
  • Python序列化模块JSON与Pickle

    Python序列化模块JSON与Pickle 序列化是将数据结构或对象转换为序列化的格式,以便它可以存储或传输。Python提供了两个标准序列化模块,即JSON和Pickle。JSON模块序列化的结果是字符串,它适用于网络传输,而Pickle模块序列化的结果是二进制,它适用于本地存储。 JSON模块 JSON是一种轻量级数据交换格式,易于人类阅读和编写,同时…

    python 2023年6月2日
    00
  • python实现TF-IDF算法解析

    Python实现TF-IDF算法解析 什么是TF-IDF算法? TF-IDF算法是一种用于信息检索和文本挖掘的常用算法,全称为Term Frequency-Inverse Document Frequency(词频-逆文档频率),是一种统计方法。TF-IDF是根据一个词在文本中出现的频率以及在文档集中出现的频率来计算该词的权重。它的主要思想是:一个词在一篇文…

    python 2023年5月20日
    00
  • python任务调度实例分析

    关于python任务调度的实例分析,我可以为您提供以下的完整攻略: Python任务调度实例分析 什么是任务调度 任务调度是指按照一定的规则和时间安排系统中需要完成的各种任务和作业,使系统正确、高效地运行,提高系统的可靠性和稳定性。 常见的任务调度器有crontab和atd,但Python也提供了灵活的任务调度机制。通常情况下,我们可以使用Python标准库…

    python 2023年5月19日
    00
  • python排序算法之希尔排序

    Python排序算法之希尔排序 简介 希尔排序(Shell sort)是插入排序的一种高效的改进算法,也被称为“缩小增量排序”。 希尔排序相比于插入排序,主要是通过将序列分割成若干个子序列,对每个子序列进行直接插入排序,使得间隔某个“增量”的元素为有序,再将子序列合并,使得整个序列有序。 实现步骤 确定增量序列d。 按照增量序列将列表分成若干子序列。 对子序…

    python 2023年6月5日
    00
  • python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例

    Python3 + PyQt5 是一种强大的组合,可以用来创建多线程网络应用程序。这篇攻略将介绍如何使用 Python3 和 PyQt5 创建 TCP 客户端和 TCP 服务器实例的示例。以下是详细的步骤: 步骤一:导入必要的模块 在程序开始之前,需要导入必需的模块。这些模块包括 socket、sys、threading、PyQt5.QtCore、PyQt5…

    python 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部