python 中collections的 deque使用详解

yizhihongxing

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 字典是一种无序的、可变的、有键的集合数据类型,其基本数据结构为键值对(key-value)。在字典中,每个键(key)都对应着一个值(value),键和值之间用冒号(:)隔开,键值对之间用逗号(,)分隔。 定义字典 可以通过花括号直接定义一个字典,也可以通过 dict() 函数来创建一个字典。其…

    python 2023年5月13日
    00
  • Redis 如何实现分布式锁?

    以下是 Redis 如何实现分布式锁的完整使用攻略。 Redis 分布式锁简介 在分布式系统中,为了保证数据的一致性和正确性,需要使用布式锁控制并发访问。Redis 作为一种高性能的存数据库,可以很好地实现分布式锁。 Redis布式锁的实现原理是利用 Redis 的 SETNX 命令(SET if Not eXists),该命令可以在 Redis 中设置一个…

    python 2023年5月12日
    00
  • Python 中的lambda函数介绍

    关于Python中的lambda函数,我可以给您提供一个详细攻略,以增加大家对它的了解。 1. 什么是lambda函数 lambda函数,也称作匿名函数,是一种可以在一行内定义、声明并使用的小型函数。与def语句定义的函数不同,lambda函数不需要函数名、return语句以及函数定义。 lambda函数主要用于编写需要一次性使用的代码段,比如作为函数参数进…

    python 2023年6月3日
    00
  • python实现csv格式文件转为asc格式文件的方法

    这里是使用Python实现csv格式文件转为asc格式文件的完整攻略。 1. 什么是CSV格式文件? CSV格式文件全称为Comma-Separated Values,是一种文本格式,也是一种通用的数据交换格式。CSV文件中的每个数据字段都是由逗号分隔的,每行表示一个记录。CSV文件可用文本编辑器打开和编辑,非常的易读和非常的通用,是互联网上常见的数据交换格…

    python 2023年5月20日
    00
  • Python实现粒子群算法的示例

    下面是详细讲解“Python实现粒子群算法的示例”的完整攻略,包括算法原理、Python实现和两个示例说明。 算法原理 粒子群算法(Particle Swarm Optimization,PSO)是一种群体智能的优化算法,其基本思想是通过模拟鸟群或鱼群等生物群体的行为,来寻找最优解。在粒子群算法中,每个粒子代表一个解,整个粒子群代表一个解空间,每个粒子的位置…

    python 2023年5月14日
    00
  • Python 字符串与二进制串的相互转换示例

    关于“Python 字符串与二进制串的相互转换示例”,以下是完整的攻略,包含具体的示例说明。 标题:Python 字符串与二进制串的相互转换示例 什么是字符串与二进制串? 在 Python 中,字符串(string)是一种表示文本数据的类型,由一系列 Unicode 编码组成。而二进制串(binary)是一种表示二进制数据的类型,由一系列 0 和 1 的位组…

    python 2023年6月5日
    00
  • 浅谈Python3中print函数的换行

    下面是“浅谈Python3中print函数的换行”的完整攻略: 1. 什么是print函数 在Python中,print()是最为常用的函数之一,用于将一个或多个值打印输出到屏幕。print()函数的基本语法如下: print(*objects, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False) 其中,obje…

    python 2023年6月5日
    00
  • python实现定时发送qq消息

    当然,以下是详细讲解 “Python实现定时发送QQ消息”的完整攻略。 1. Python环境准备 首先,我们需要确保已经安装好了Python环境。Python环境可以从官方网站或者Anaconda官网中下载合适的版本。 2. 安装QQ机器人框架 我们可以使用针对QQ的机器人框架来实现定时发送QQ消息。目前市面上比较流行的QQ机器人框架有QBot和Smart…

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