首页 > 其他分享 >01-deque类-双端队列-完全解读

01-deque类-双端队列-完全解读

时间:2024-03-13 13:01:25浏览次数:29  
标签:数据项 deque 01 双端 maxlen collections print import

1  deque类的适用场景

1.1 适用场景

deque并非列表的完美替代,一般情况下,它最适用于:

1.1  左入右出,或者 ,右入左出的数据结构。

       只通过对其两端数据的操作,实现压入和弹出。比如:简单的堆栈

1.2  创建有限长度的数据集,对近期有限事务或类似数据池的追踪记录。比如:日志等

1.2  不适合的场景

频繁访问序列中间元素的事务。(通过deque对象存取中间数据的效率相对低,在这种情况下,应当使用列表)

2  简要介绍及deque的发音

collections模块是对python通用容器类型(字典、集合、元组、列表)的补充。

deque对象是其中之一,实现了【双端队列数据类型】及其操作。

发音:deck,即:“double-ended queue”


本文基于官方文档,加入了理解,添加了一些应用实例。

感觉用【双端】更准确,而不是【双向】

3  定义

class collections.deque([iterable[, maxlen]])

对定义的说明:

1、使用deque(),将返回一个新的deque对象;

2、该对象初始化时,使用了append()函数,因此对象中的元素由左自右排列;

3、初始化该对象,使用的数据,来源于参数表中的可迭代对象(iterable);

4、如果未传入可迭代对象(即未传入iterable参数),则该deque对象为空(empty)。


deque对象兼具堆栈和列表的特性:

1、线程安全

2、从两端弹出和添加元素具有极好的运行效能,时间复杂度均为O(1)

3、类比一般列表,在右侧操作效率会非常高,但在左侧或者中间执行类似操作时,效率会大幅降低。

注意:这些特性实质决定了它的应用场景。

4  maxlen参数【重要】

4.1  初始化deque对象时,如果【未指定maxlen或者maxlen的值为None】,则不会限制deque对象中数据项的个数。

4.2  指定的maxlen就是deque对象的最大数据项个数。

【以下特性重要】

4.3  一旦限定长度已满,当添加新的数据项时,将从另一端丢弃相应数量的数据项(有界的deque对象,类似Unix中的尾部过滤器)。

4.4  这种特性,常被用作跟踪和记录最近的事务(就像日志等)。 

备注:maxlen同时也是deque对象中的一个只读属性。

5  deque中的方法

5.1  append(x)

功能:【在右侧】添加数据项

与列表中的append相比,使用方法完全一致。

差异:若deque初始化,传入maxlen参数,则限制了它的长度。再在右侧添加若干元素,就会挤出左侧对应数量的数据项。而列表则不会。

类似的情况,在deque中,向两端添加数据项的操作(比如,appendleft/extend等,均存在,以下不再说明。(使用insert(i,x),超出长度限制时,不会溢出,而是触发异常。)

示例:

from collections import deque

d = deque([0, 1, 2, 3, 4], maxlen=5)
print(*d)  # 0 1 2 3 4
d.append(6)
print(*d)  # 1 2 3 4 6

ls = [0, 1, 2, 3, 4]
print(*ls)  # 0 1 2 3 4
ls.append(6)
print(*ls)  # 0 1 2 3 4 6

5.2  appendleft(x)

功能:【在左侧】添加数据项

注意:右侧可能挤出

from collections import deque

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

5.3  clear()

功能:清空deque中的所有数据项,将其长度变为0

from collections import deque

d = deque([0, 1, 2, 3, 4], maxlen=5)
print(*d)  # 0 1 2 3 4
d.clear()
print(len(d))  # 0

5.4  copy()

功能:创建对象的浅拷贝

from collections import deque

d = deque([0, 1, 2, 3, 4], maxlen=5)
print(*d)  # 0 1 2 3 4
e = d.copy()
print(*e)  # 0 1 2 3 4

5.5  count(x)

功能:返回对象数据项中包含x的数量(跟列表一样)

from collections import deque

d = deque([0, 1, 2, 3, 4], maxlen=5)
print(*d)  # 0 1 2 3 4
print(d.count(4)) # 1


ls = [0, 1, 2, 3, 4]
print(*ls)  # 0 1 2 3 4
print(ls.count(4))

5.6  extend(iterable)

功能:将传入的可迭代对象,以【单个数据项】的形式,添加到到deque对象右侧。

注意:左侧挤出

from collections import deque

d = deque([0, 1, 2, 3, 4], maxlen=5)
print(*d)  # 0 1 2 3 4
d.extend([7, 8, 9])
print(*d)  # 3 4 7 8 9

这里需要特别注意,extend方法与append方法的区别

extend:以单个元素的形式,添加【可迭代对象】。

append:以整体形式,添加【合法的任意数据项】。

示例如下:

from collections import deque

d1 = deque([0, 1, 2, 3, 4], maxlen=5)
print(*d1)  # 0 1 2 3 4
d1.extend([7, 8, 9])
print(*d1)  # 3 4 7 8 9

d2 = deque([0, 1, 2, 3, 4], maxlen=5)
print(*d2)  # 0 1 2 3 4
d2.append([7, 8, 9])
print(*d2)  # 1 2 3 4 [7, 8, 9]

5.7  extendleft(iterable)

功能:与extend相同,只是方向变为左侧。

注意:添加的顺序与可迭代对象中的元素顺序相反

考虑堆栈,后入先出

示例如下:

from collections import deque

d1 = deque([0, 1, 2, 3, 4], maxlen=5)
print(*d1)  # 0 1 2 3 4
d1.extendleft([7, 8, 9])
print(*d1)  # 9 8 7 0 1

5.8  index(x[, start[, stop]])

功能:在切片[start:end]范围内,返回第一个x的位置,如果未找到,则抛出ValueError异常。

因此,使用index方法,在不确定是否能找到时,需要处理异常,否则程序无法运行。

此方法与列表等序列中的同名方法一致。

示例如下:

from collections import deque

d = deque([0, 1, 2, 3, 4, 5, 3, 4, 5], maxlen=10)
print(*d)  # 0 1 2 3 4 5 3 4 5

ind1 = d.index(3,4) # 从第4个位置(包含)开始找
print(ind1) # 6

ind1 = d.index(3,4,5) 
# 这个语句编译时报错:ValueError: 3 is not in deque

5.9  insert(ix)

功能:在位置i,插入数据项x

注意:与append/extend/extendleft不同的是,插入数据超出maxlen限制时,程序不会从左侧挤出对应数量的数据项,而会抛出IndexError。

示例如下:

from collections import deque

d = deque([0, 1, 2, 3, 4], maxlen=6)
print(*d)  # 0 1 2 3 4
ins = d.insert(1,7)
print(*d) # 0 7 1 2 3 4

ins = d.insert(1,9)
# IndexError: deque already at its maximum size

5.10  pop()

功能:从右侧,弹出并返回数据项,如果没有数据,则抛出IndexError

from collections import deque

d = deque([0, 1], maxlen=6)
print(*d)  # 0 1

pop_num = d.pop()
print(pop_num,*d)  # 1 0

pop_num = d.pop()
print(pop_num,*d)  # 0,此时d中已无数据

d.pop()
# IndexError: pop from an empty deque

5.11  popleft()

功能:与pop()相同,仅将方向变为左侧

5.12  remove(value)

功能:删除遇到的第一个value数据项【注意:这里没有start,stop参数】

from collections import deque

d = deque([0, 1,2,3,4], maxlen=6)
print(*d)  # 0 1 2 3 4
d.remove(4)
print(*d) # 0 1 2 3

5.13  reverse()

功能:反转对象中的各数据项,并返回None【注意,是原地反转,是改变对象自己的数据项】

from collections import deque

d = deque([0, 1,2,3,4], maxlen=6)
print(*d)  # 0 1 2 3 4
d.reverse()
print(*d) # 4 3 2 1 0

5.14  rotate(n=1)

功能:旋转对象中的n个数据项,返回None


            当n为正数时,从右到左(相当于逆时间)旋转n个数据项。

           【为1时,相当于d.appendleft(d.pop())】


            当n为负数时,从左到右(相当于顺时间)旋转n个数据项。

           【为-1时,相当于d.append(d.popleft())】


           当n为0时,数据项不变

示例(n为正时):

from collections import deque

d = deque([0, 1,2,3,4], maxlen=6)
print(*d)  # 0 1 2 3 4
d.rotate(1)
print(*d) # 4 0 1 2 3
d.rotate(2)
print(*d) # 2 3 4 0 1

示例(n为负时):

from collections import deque

d = deque([0, 1,2,3,4], maxlen=6)
print(*d)  # 0 1 2 3 4
d.rotate(-1)
print(*d) # 1 2 3 4 0
d.rotate(-2)
print(*d) # 3 4 0 1 2

5.15 deque支持的其它操作

这些操作不在deque类中实现,而是本身参与表达式运算(如:迭代、二进制封装、成员运算符in、切片操作等),或者将实例作为参数,传给其它函数。

比如:len(d), reversed(d), copy.copy(d), copy.deepcopy(d)

标签:数据项,deque,01,双端,maxlen,collections,print,import
From: https://blog.csdn.net/2301_80452984/article/details/136528247

相关文章

  • npm启动vue项目报错error:0308010C:digital envelope routines::unsupported的解决办
    错误截图解决方法package.json文件中修改dev项为setNODE_OPTIONS=--openssl-legacy-provider&vue-cli-serviceserve:"scripts":{"dev":"setNODE_OPTIONS=--openssl-legacy-provider&vue-cli-serviceserve","build:prod......
  • KTH1601与无线蓝牙耳机:让音乐与科技无缝连接
    在数字时代,无线蓝牙耳机因其便捷和高质的音质成为了音乐爱好者的首选。而随着技术的不断进步,现在的无线蓝牙耳机不仅仅是一个简单的音频播放设备,它还能通过智能感应技术,实现更为人性化的操作体验。 苹果AirPods耳机的创新翻盖触发设计, 堪称工业设计经典(图片来源苹果......
  • 01-Ajax&Axios
    AjaxAsynchronousJavascriptAndXml传统的请求方式:URL地址栏超链接form表单通过JS代码window.open(url)document.location.href=urlwindow.location.href=url缺陷:页面全部刷新,用户体验较差用户体验不连贯概述Ajax可以在浏览器中发送......
  • 代码随想录算法训练营day21 | leetcode 530. 二叉搜索树的最小绝对差、501. 二叉搜索
    目录题目链接:530.二叉搜索树的最小绝对差-简单题目链接:501.二叉搜索树中的众数-简单题目链接:236.二叉树的最近公共祖先-中等题目链接:530.二叉搜索树的最小绝对差-简单题目描述:给你一个二叉搜索树的根节点root,返回树中任意两不同节点值之间的最小差值。差值是一个正数,......
  • [js error] SyntaxError: Unexpected token ‘{‘ (at uniFile.js?t=1710138723630:1:
    问题详情问题描述封装一个函数的时候报错问题原因SyntaxError:Unexpectedtoken‘{’(atuniFile.js?t=1710138723630:1:34)SyntaxError:意外的令牌“{”(在uniFile.js?t=1710138723630:1:34)意思是有不符合语法规范的地方在第一行34个字符的地方去到报错文件的地方查......
  • 「AGC019B」 Reverse and Compare
    题意给定一个长度为\(n\)小写英文字母组成的字符串\(s\)。可以任意选定\(1\lex\ley\len\),把\(s_x\)到\(s_y\)之间的字符翻转。求最终不同字符串的方案数。分析我们先考虑所有字符都不同的情况。小学奥数的加法原理告诉我们,每一位都不同的字符串,对于第\(i\)位,可......
  • 01-Java程序基础
    标识符与变量标识符标识符可以标志:类名,方法名,接口名,常量名命名规则:只能由字母,数字,下划线,$组成不能以数字开头关键字不能做标识符标识符严格区分大小写例如:classHelloWorld{}classhelloWorld{}这两个类是完全不同的类,但如果用javac编译这个文件仅......
  • 01Python基础
    Python基础按照约定俗成的惯例,应该始终坚持使用4个空格的缩进。Python程序是大小写敏感的,如果写错了大小写,程序会报错。数据类型和变量数据类型整数任意大小的整数,包括负整数,和数学上的写法一致。十六进制,用0x前缀和0-9,a-f表示对于很大的数,100000000,可以写成100_00......
  • docker_01
    项目演示https://gitee.com/pear-admin/pear-admin-flask#项目2-pycharm打开-安装依赖pipinstall-rrequirements.txt-打开models,创建数据库注释掉解开注释-在命令行中运行-在命令中执行:pythonmanage.pyrunserver-打......
  • 什么是R语言?什么是R包?-R语言001
    R语言是一种专为统计计算和图形而设计的编程语言和环境。它最初由罗斯·伊哈卡和罗伯特·亨特尔在1993年创建,灵感来源于S语言。R语言已经发展成为统计学、数据分析、科学研究以及许多其他领域中最受欢迎和广泛使用的工具之一。R语言的核心是一个开源的解释型语言,这意味着它允许......