python 中collections的 deque使用详解

Python 中 collections 的 deque 使用详解

deque 是 Python 内置的一个双向队列数据类型,具有高效地添加和弹出元素的特性,功能类似于列表,但操作更加高效。

1. 创建 deque 对象

deque 对象可以通过 collections 模块中的 deque 函数来创建,不同于列表,它接收一个 maxlen 参数,用于限制 deque 的最大容量,如果不传入该参数,则 deque 会无限扩容。

from collections import deque

# 创建一个空 deque
d = deque()

# 创建一个带有默认值的 deque(初始容量为 3)
d = deque([1, 2, 3], maxlen=3)

2. 添加元素

双向队列的头部和尾部都可以添加元素。deque 提供了 3 种方法添加元素,分别是:

  • append(x): 添加元素 x 到 deque 的右边(即尾部)。
  • appendleft(x): 添加元素 x 到 deque 的左边(即头部)。
  • extend(iterable): 添加一个可迭代对象的多个元素到 deque 的右边(即尾部)。
  • extendleft(iterable): 添加一个可迭代对象的多个元素到 deque 的左边(即头部),注意添加顺序与可迭代对象的顺序相反。

下面是添加元素的示例代码:

d = deque([1, 2, 3])
d.append(4)
print(d)  # deque([1, 2, 3, 4], maxlen=None)

d.appendleft(0)
print(d)  # deque([0, 1, 2, 3, 4], maxlen=None)

d.extend([5, 6])
print(d)  # deque([2, 3, 4, 5, 6], maxlen=None)

d.extendleft([0, -1])
print(d)  # deque([-1, 0, 2, 3, 4, 5, 6], maxlen=None)

3. 弹出元素

弹出元素可以使用 pop() 方法和 popleft() 方法,弹出一个 deque 中的元素,当 deque 为空时,它们会抛出 IndexError 异常。

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

d.pop()  # 弹出 4
print(d)  # deque([1, 2, 3], maxlen=None)

d.popleft()  # 弹出 1
print(d)  # deque([2, 3], maxlen=None)

4. 旋转操作

旋转 deque 的两种方法是 rotate(n)rotate(-n),它们可以将 deque 的元素向右或者向左移动 n 个位置,当 n > 0 时向右旋转,当 n < 0 时向左旋转,n 的绝对值表示旋转的位数。

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

d.rotate(2)  # 右旋转 2 位
print(d)  # deque([4, 5, 1, 2, 3], maxlen=None)

d.rotate(-2)  # 左旋转 2 位
print(d)  # deque([1, 2, 3, 4, 5], maxlen=None)

5. 示例说明

示例 1:使用 deque 模拟滑动窗口

下面的示例展示了如何使用 deque 来模拟一个滑动窗口。给定一段长度为 n 的数组和一个滑动窗口大小 k,请输出每个滑动窗口的最大值。

import collections

def max_sliding_window(nums, k):
    res = []
    dq = collections.deque()
    for i in range(len(nums)):
        if i >= k and dq[0] <= i-k:
            dq.popleft()
        while dq and nums[dq[-1]] < nums[i]:
            dq.pop()
        dq.append(i)
        if i >= k - 1:
            res.append(nums[dq[0]])
    return res

print(max_sliding_window([1,3,-1,-3,5,3,6,7], 3))  # [3, 3, 5, 5, 6, 7]

示例 2:使用 deque 获得滑动平均值

下面的示例展示了如何使用 deque 来计算一个滑动窗口的平均值。这里使用 deque 来维护当前的窗口,每次添加数字时,同时移除超出窗口大小的第一个数,然后计算窗口内的平均值。

import collections

class MovingAverage:

    def __init__(self, size: int):
        self.size = size
        self.nums = collections.deque()
        self.sum = 0

    def next(self, val: int) -> float:
        if len(self.nums) == self.size:
            self.sum -= self.nums.popleft()
        self.sum += val
        self.nums.append(val)
        return self.sum / len(self.nums)

m = MovingAverage(3)
print(m.next(1))  # 1.0
print(m.next(10))  # 5.5
print(m.next(3))  # 4.666666666666667
print(m.next(5))  # 6.0

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 中collections的 deque使用详解 - Python技术站

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

相关文章

  • python中多层嵌套列表的拆分方法

    Python中多层嵌套列表的拆分方法 在Python中,我们可以使用循环和递归的方法来拆分多层嵌套列表。本攻略将详细介绍如何拆分多层嵌套列表。 使用循环拆分多层嵌套列表 以下是一个示例代码,演示如何使用循环拆分多层嵌套列表: # 使用循环拆分多层嵌套列表 nested_list = [1, [2, [3, 4], 5], 6, [7, 8]] flat_li…

    python 2023年5月13日
    00
  • python编程进阶之异常处理用法实例分析

    Python编程进阶之异常处理用法实例分析 异常处理的作用和概念 在编程过程中,如果程序遇到了无法处理的错误,就会导致程序崩溃。为了防止这种情况发生,我们需要使用异常处理机制。异常处理就是在程序出现错误时,不直接崩溃,而是抛出一个异常,然后让我们自己定义处理这个异常的代码。这样就可以让我们更好地控制程序的运行,提高程序的稳定性和可靠性。 常见异常和处理方式 …

    python 2023年5月13日
    00
  • 如何在python中写hive脚本

    当在 Python 中进行大数据处理时,经常需要和Hive交互,执行查询和操作。以下是在 Python 中写 Hive 脚本的步骤和示例: 1. 安装PyHive库 PyHive是Apache Hive的Python库,提供了Python连接到Hive的驱动, 安装PyHive之前需要先安装好Thrift 运行以下命令在终端中安装PyHive: pip in…

    python 2023年6月3日
    00
  • python逐行读取文件内容的三种方法

    当我们需要处理大型文件时,可能会需要逐行读取文件的内容。Python为我们提供了多种读取文件的方式,以下是Python逐行读取文件内容的三种方法: 1. 使用for循环逐行读取文件内容 with open(‘file.txt’, ‘r’) as f: for line in f: print(line.strip()) 这种方法会一次读取一行,每次循环会返回…

    python 2023年6月5日
    00
  • python面向对象多线程爬虫爬取搜狐页面的实例代码

    Python面向对象多线程爬虫是一种快速、高效地爬取网站信息的方法。到目前为止,已经有很多面向对象多线程爬虫的实现方法,其中就包括使用Python编程语言的方法。本篇攻略将详细介绍Python面向对象多线程爬虫的实现。 一、爬虫的基础知识 爬虫是一种获取互联网信息的技术。它可以通过网络获取互联网上的信息,并从中提取所需的信息。爬虫基础知识指掌握爬虫的原理、流…

    python 2023年5月14日
    00
  • Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)

    Python中的数组和列表都是非常常见的数据结构,在实际的开发中也经常用到。而冒号则是Python中许多数据结构中的核心语法之一,可以实现许多方便的功能。下面就来详细讲解一下“Python中数组、列表:冒号的灵活用法介绍”。 数组和列表基础知识 在Python中,数组和列表都是用来存储一组数据的数据结构,但是它们之间有一些区别。 数组通常用于存储数值型数据,…

    python 2023年6月5日
    00
  • python DataFrame的shift()方法的使用

    下面是详细的攻略。 什么是shift()方法 shift()是Python Pandas库中DataFrame的一个方法,用于将给定列的值在DataFrame中向上或向下移动,从而在数据的指定列中添加时滞。 使用方式如下: DataFrame.shift(periods=1, freq=None, axis=0, fill_value=None) 其中各个参…

    python 2023年6月3日
    00
  • python高效过滤出文件夹下指定文件名结尾的文件实例

    下面是讲解Python高效过滤指定文件名结尾的文件的攻略: 1. 问题描述 我们有时候需要编写一个程序来处理一个文件夹下的文件,但是我们只想处理其中的一些特定类型的文件,比如只处理结尾为”.txt”的文件,这时候就需要过滤出目标文件。 2. 实现方法 在Python中,可以通过以下步骤实现过滤出指定文件名结尾的文件: 2.1. os模块中函数说明 Pytho…

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