Python容器专题 - deque(队列)--双向队列对象

简介: Python容器专题 - deque(队列)--双向队列对象

deque(队列)–双向队列对象

Deque队列是由栈或者queue队列生成的。列表也可以用作队列,其中先添加的元素被最先取出 (“先进先出”);普通列表的一个巨大缺陷在于,其往开头(左边)插入或弹出元素时显得十分慢 ,因为所有的其他元素都必须移动一位。

Deque队列和list自带的方法类似,或者说功能上是近乎一样的,它可以向内存高效添加(append)和弹出(pop),从两端都可以。然而相比于普通列表,deque队列两个方向的大概开销都是 O(1) 复杂度。

由于collections是内建模块,无需单独安装。可以直接从collections 中导入deque:

from collections import deque

创建该对象时需要从Python自带的collections模块中进行导入deque类。它返回一个新的双向队列对象,从左到右初始化(用方法 append()) ,从 iterable (迭代对象) 数据创建。如果 iterable 没有指定,新队列为空。

接下来各位可能看一眼就觉得熟悉了,它们中的很多都已经在列表的基本方法中详细讨论并举例说明过。
接下来我们通过实例来讲解Deque队列的相关方法及其用法:

– 增 –

append(x) - 添加 x 到右端。

【eg】

from collections import deque
a = deque([1,2,3,4,5,6,7])
a.append('1')
a

[Out]:

deque([1, 2, 3, 4, 5, 6, 7, '1'])

其中,不仅可以将列表、元组传入deque队列,甚至可以是字符串等等,如:

【eg】

from collections import deque
a = deque('abcde')
a.append('1')
a

[Out]:

deque(['a', 'b', 'c', 'd', 'e', '1'])
appendleft(x) - 添加 x 到左端。

【eg】

from collections import deque
a = deque('abcde')
a.appendleft('A')
a

[Out]:

deque(['A', 'a', 'b', 'c', 'd', 'e'])
extend(iterable) - 扩展deque的右侧,通过添加iterable参数中的元素。

【eg】

from collections import deque
a = deque('abcde')
a.extend('ABC')
a

[Out]:

deque(['a', 'b', 'c', 'd', 'e', 'A', 'B', 'C'])

【eg】

from collections import deque
a = deque('abcde')
a.extend(['*',6,'&',9,'^'])
a

[Out]:

deque(['a', 'b', 'c', 'd', 'e', '*', 6, '&', 9, '^'])
extendleft(iterable) - 扩展deque的左侧,通过添加iterable参数中的元素。
  • 左添加时,在结果中iterable参数中的顺序将被反过来添加。

【eg】

from collections import deque
a = deque('abcde')
a.extendleft(['*',6,'&',9,'^'])
a

[Out]: deque([’^’, 9, ‘&’, 6, ‘*’, ‘a’, ‘b’, ‘c’, ‘d’, ‘e’])

insert(i, x) - 在位置 i 插入 x 。
  • 如果插入会导致一个限长 deque 超出长度 maxlen 的话,就引发一个 IndexError。

【eg】

from collections import deque
a = deque('abcde')
a.insert(2,'666')
a

[Out]:

deque(['a', 'b', '666', 'c', 'd', 'e'])

– 删 –

pop() - 移去并且返回一个元素,deque 最右侧的那一个。
  • 如果没有元素的话,就引发一个 IndexError。

【eg】

from collections import deque
a = deque('abcde')
a.pop()
a

[Out]: deque([‘a’, ‘b’, ‘c’, ‘d’])

popleft() - 移去并且返回一个元素,deque 最左侧的那一个。
  • 如果没有元素的话,就引发 IndexError。

【eg】

from collections import deque
a = deque('abcde')
a.popleft()
a

[Out]: deque([‘b’, ‘c’, ‘d’, ‘e’])

remove(value) - 移除找到的第一个 value。
  • 如果没有的话就引发 ValueError。

【eg】

from collections import deque
a = deque('albc3d9wea9e')
a.remove('9')
a

[Out]: deque([‘a’, ‘l’, ‘b’, ‘c’, ‘3’, ‘d’, ‘w’, ‘e’, ‘a’, ‘9’, ‘e’])

【eg】

from collections import deque
a = deque([1,2,'W',3,'9','#',9,6,'9',5])
a.remove('9')
a

[Out]: deque([1, 2, ‘W’, 3, ‘#’, 9, 6, ‘9’, 5])

clear() - 移除所有元素,使其长度为0.

【eg】

from collections import deque
a = deque([1,2,'W',3,'9','#',9,6,'9',5])
a.clear()
a

[Out]: deque([])

– 改 –

rotate(n=1) - 向右循环移动 n 步。
  • 如果 n 是负数,就向左循环。
  • 如果deque不是空的,向右循环移动一步就等价于 d.appendleft(d.pop()) , 向左循环一步就等价于 d.append(d.popleft()) 。

【eg】

from collections import deque
a = deque([1,2,'W',3,'9','#',9,6,'9',5])
a.rotate()
a

[Out]: deque([5, 1, 2, ‘W’, 3, ‘9’, ‘#’, 9, 6, ‘9’])

【eg】

from collections import deque
a = deque([1,2,'W',3,'9','#',9,6,'9',5])
a.rotate(1)
a

[Out]: deque([5, 1, 2, ‘W’, 3, ‘9’, ‘#’, 9, 6, ‘9’])

【eg】

from collections import deque
a = deque([1,2,'W',3,'9','#',9,6,'9',5])
a.rotate(2)
a

[Out]: deque([‘9’, 5, 1, 2, ‘W’, 3, ‘9’, ‘#’, 9, 6])

【eg】

from collections import deque
a = deque([1,2,'W',3,'9','#',9,6,'9',5])
a.rotate(-1)
a

[Out]: deque([2, ‘W’, 3, ‘9’, ‘#’, 9, 6, ‘9’, 5, 1])

– 查 –

index(x[, start[, stop]]) - 返回 x 在 deque 中的位置(由值反查索引)。
  • 可选参数start与stop指定了查询范围在索引 start 之后,索引 stop 之前。
  • 返回第一个匹配项,如果未找到则引发 ValueError。

【eg】

from collections import deque
a = deque([1,2,'W',3,'9','#',9,6,'9',5])
a.index('#',0,3)

[Out]:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-101-453fb381b6f0> in <module>
      1 from collections import deque
      2 a = deque([1,2,'W',3,'9','#',9,6,'9',5])
----> 3 a.index('#',0,3)
ValueError: '#' is not in deque

【eg】

from collections import deque
a = deque([1,2,'W',3,'9','#',9,6,'9',5])
a.index('#',0,6)

[Out]: 5

Deque对象还提供了一个只读属性:
maxlen - Deque的最大尺寸。
  • 若没有限定则为 None 。

– 统计与排序–

count(x) - 计算 deque 中元素等于 x 的个数。

【eg】

from collections import deque
a = deque([1,2,'W',3,'9','#',9,6,'9',5])
a.count('9')

[Out]: 2

reverse() - 将deque逆序排列。
  • 返回 None 。

【eg】

from collections import deque
a = deque([1,2,'W',3,'9','#',9,6,'9',5])
a.reverse()
a

[Out]: deque([5, ‘9’, 6, 9, ‘#’, ‘9’, 3, ‘W’, 2, 1])

– 浅拷贝–

[注]:(点击超链接查看相关知识点)

copy() - 创建一份浅拷贝。

【eg】

from collections import deque
a = deque([1,2,'W',3,'9','#',9,6,'9',5])
b = a.copy()
b[2] = '666'
print(a,'\n',b)

[Out]: deque([1, 2, ‘W’, 3, ‘9’, ‘#’, 9, 6, ‘9’, 5])

deque([1, 2, ‘666’, 3, ‘9’, ‘#’, 9, 6, ‘9’, 5])

但要注意,Python变量的赋值是指针的复制,如果变量a直接赋值到b,则改变b也会改变a的值,因为他们修改了同一块内存空间:

from collections import deque
a = deque([1,2,'W',3,'9','#',9,6,'9',5])
b = a
b[2] = '666'
print(a,'\n',b)

[Out]: deque([1, 2, ‘666’, 3, ‘9’, ‘#’, 9, 6, ‘9’, 5])

deque([1, 2, ‘666’, 3, ‘9’, ‘#’, 9, 6, ‘9’, 5])

除了以上操作,deque 还支持迭代、封存、len(d)、reversed(d)、copy.copy(d)、copy.deepcopy(d)、成员检测运算符 in 以及下标引用例如通过 d[0] 访问首个元素等。 索引访问在两端的复杂度均为 O(1) 但在中间则会低至 O(n)。 如需快速随机访问,请改用列表。 Deque从版本3.5开始支持 __add__(), __mul__(), 和 __imul__() 。

目录
相关文章
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
341 4
|
安全 JavaScript Java
Python中None与NoneType的真相:从单例对象到类型系统的深度解析
本文通过10个真实场景,深入解析Python中表示“空值”的None与NoneType。从单例模式、函数返回值,到类型注解、性能优化,全面揭示None在语言设计与实际编程中的核心作用,帮助开发者正确高效地处理“无值”状态,写出更健壮、清晰的Python代码。
4526 3
|
Python
解决Python中AttributeError:'image'对象缺少属性'read_file'的问题策略。
通过上述策略综合考虑,您将能够定位问题并确定如何解决它。记住,Python社区很庞大,也很乐于帮助解决问题,因此不要害怕在求助时提供尽可能多的上下文和您已经尝试过的解决方案。
366 0
|
Python
解决Python报错:DataFrame对象没有concat属性的多种方法(解决方案汇总)
总的来说,解决“DataFrame对象没有concat属性”的错误的关键是理解concat函数应该如何正确使用,以及Pandas库提供了哪些其他的数据连接方法。希望这些方法能帮助你解决问题。记住,编程就像是解谜游戏,每一个错误都是一个谜题,解决它们需要耐心和细心。
728 15
|
人工智能 Python
[oeasy]python083_类_对象_成员方法_method_函数_function_isinstance
本文介绍了Python中类、对象、成员方法及函数的概念。通过超市商品分类的例子,形象地解释了“类型”的概念,如整型(int)和字符串(str)是两种不同的数据类型。整型对象支持数字求和,字符串对象支持拼接。使用`isinstance`函数可以判断对象是否属于特定类型,例如判断变量是否为整型。此外,还探讨了面向对象编程(OOP)与面向过程编程的区别,并简要介绍了`type`和`help`函数的用法。最后总结指出,不同类型的对象有不同的运算和方法,如字符串有`find`和`index`方法,而整型没有。更多内容可参考文末提供的蓝桥、GitHub和Gitee链接。
441 11
|
安全 测试技术 开发者
Python中的“空”:对象的判断与比较
在Python开发中,判断对象是否为“空”是常见操作,但其中暗藏诸多细节与误区。本文系统梳理了Python中“空”的判定逻辑,涵盖None类型、空容器、零值及自定义对象的“假值”状态,并对比不同判定方法的适用场景与性能。通过解析常见误区(如混用`==`和`is`、误判合法值等)及进阶技巧(类型安全检查、自定义对象逻辑、抽象基类兼容性等),帮助开发者准确区分各类“空”值,避免逻辑错误,同时优化代码性能与健壮性。掌握这些内容,能让开发者更深刻理解Python的对象模型与业务语义交集,从而选择最适合的判定策略。
672 5
|
存储 SQL 索引
Python入门:7.Pythond的内置容器
Python 提供了强大的内置容器(container)类型,用于存储和操作数据。容器是 Python 数据结构的核心部分,理解它们对于写出高效、可读的代码至关重要。在这篇博客中,我们将详细介绍 Python 的五种主要内置容器:字符串(str)、列表(list)、元组(tuple)、字典(dict)和集合(set)。
Python入门:7.Pythond的内置容器
|
缓存 监控 算法
Python内存管理:掌握对象的生命周期与垃圾回收机制####
本文深入探讨了Python中的内存管理机制,特别是对象的生命周期和垃圾回收过程。通过理解引用计数、标记-清除及分代收集等核心概念,帮助开发者优化程序性能,避免内存泄漏。 ####
641 35
|
存储 数据处理 Python
Python如何显示对象的某个属性的所有值
本文介绍了如何在Python中使用`getattr`和`hasattr`函数来访问和检查对象的属性。通过这些工具,可以轻松遍历对象列表并提取特定属性的所有值,适用于数据处理和分析任务。示例包括获取对象列表中所有书籍的作者和检查动物对象的名称属性。
448 2
|
开发者 Docker Python
从零开始:使用Docker容器化你的Python Web应用
从零开始:使用Docker容器化你的Python Web应用
961 4

推荐镜像

更多