python-容器之双端队列deque

目录

介绍

创建

操作符

拼接操作符 +

重复操作符 *

比较操作符(==、!=、>、<、>=、<=)

赋值操作符(+=、*=)

成员操作符(in、not in)

方法

最大尺寸

添加

从右侧

从左侧

从右侧扩展

从左侧扩展

任意位置插入

索引

删除

从右侧

从左侧

按值

清空

逆序

循环

函数

长度

最值

求和

参考


介绍

双端队列,即两端都可以进出的队列。

创建

deque([iterable,[maxlen])

>>> from collections import *
>>> d  = deque([1,2,3,4])

双端队列
索引0123
1234

操作符

拼接操作符 +

>>> dd  =deque([5,6,7,8])
>>> d+dd
deque([1, 2, 3, 4, 5, 6, 7, 8])

重复操作符 *

>>> dd * 3
deque([5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8])

比较操作符(==、!=、>、<、>=、<=)

>>> d
deque([1, 2, 3, 4])
>>> dd
deque([5, 6, 7, 8])
>>> d<dd
True
>>> d == dd
False

篇幅原因,其他的请读者自行尝试

赋值操作符(+=、*=)

>>> d += dd
>>> d
deque([1, 2, 3, 4, 5, 6, 7, 8])
>>> d *=2
>>> d
deque([1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8])

成员操作符(in、not in)

>>> 7 in d
True
>>> 9 in d
False
>>> 9 not in d
True

注:介绍方法时,d重置为deque([1,2,3,4])

方法

最大尺寸

maxlen,未设置时为None。

>>> print(d.maxlen)
None

添加

从右侧

append(x)

添加 x 到右端。

>>> d.append(5)
>>> d
deque([1, 2, 3, 4, 5])

从左侧

appendleft(x)

添加 x 到左端。

>>> d.appendleft(0)
>>> d
deque([0, 1, 2, 3, 4, 5])

从右侧扩展

extend(iterable)

扩展deque的右侧,通过添加iterable参数中的元素。

>>> t = (7,8,9)
>>> d.extend(t)
>>> d
deque([0, 1, 2, 3, 4, 5, 7, 8, 9])

从左侧扩展

extendleft(iterable)

扩展deque的左侧,通过添加iterable参数中的元素。注意,左添加时,在结果中iterable参数中的顺序将被反过来添加。

>>> d.extendleft(t)
>>> d
deque([9, 8, 7, 0, 1, 2, 3, 4, 5, 7, 8, 9])

任意位置插入

insert(i, x)

在位置 i 插入 x

如果插入会导致一个限长 deque 超出长度 maxlen 的话,就引发一个IndexError

>>> d.insert(10,33)
>>> d
deque([9, 8, 7, 0, 1, 2, 3, 4, 5, 7, 33, 8, 9])

如果设置了maxlen,为防止IndexError,可在使用前用内置函数len判断一下是否插入后会超出长度。

索引

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

返回 x 在 deque 中的位置(在索引 start 之后,索引 stop 之前)。 返回第一个匹配项,如果未找到则引发ValueError

>>> d.index(9)
0
>>> d.index(9,2)
12

>>> d.index(9,2,11)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 9 is not in deque

为防止ValueError,可使用成员操作符in判断是否存在。

删除

从右侧

pop()

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

>>> d.pop()
9

为防止IndexError,可在使用前用内置函数len判断一下长度是否为0。

从左侧

popleft()

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

>>> d.popleft()
9
>>> d
deque([8, 7, 0, 1, 2, 3, 4, 5, 7, 33, 8])

为防止IndexError,可在使用前用内置函数len判断一下长度是否为0。

按值

remove(value)

移除找到的第一个 value。 如果没有的话就引发ValueError

>>> d.remove(8)
>>> d
deque([7, 0, 1, 2, 3, 4, 5, 7, 33, 8])

为防止ValueError,可使用成员操作符in判断是否存在。

清空

copy()

创建一份浅拷贝

clear()

移除所有元素,使其长度为0

>>> dd = d.copy()
>>> d.clear()
>>> d
deque([])
>>> d = dd

逆序

reverse()

将deque原地逆序排列。

>>> d.reverse()
>>> d
deque([8, 33, 7, 5, 4, 3, 2, 1, 0, 7])

循环

rotate(n=1)

向右循环移动 n 步。 如果 n 是负数,就向左循环。

如果deque不是空的,向右循环移动一步就等价于 d.appendleft(d.pop()) , 向左循环一步就等价于 d.append(d.popleft())

>>> d.rotate()
>>> d
deque([7, 8, 33, 7, 5, 4, 3, 2, 1, 0])

>>> d.rotate(-1)
>>> d
deque([8, 33, 7, 5, 4, 3, 2, 1, 0, 7])

函数一节延续上面的d

函数

长度

len

返回对象元素个数

>>> len(d)
10

最值

max

返回可迭代对象中最大的元素

min

返回可迭代对象中最小的元素

>>> max(d)
33
>>> min(d)
0

求和

sum

iterable 中的项求和并返回总计值。

>>> sum(d)
70

参考

python3.7官方文档-collections.deque

练习:滑动窗口的最大值

可使用双端队列,不过我就击败了20%多。

更多python相关内容:【python总结】python学习框架梳理

本人b站账号:lady_killer9

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。如果您感觉有所收获,自愿打赏,可选择支付宝18833895206(小于),您的支持是我不断更新的动力。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Python的collections模块是一个用于实现特定目标容器的模块,它提供了一些替代标准内建容器(如dict、list、set和tuple)的选择。该模块包含了一些有用的数据结构和容器类型,可以帮助我们更方便地处理数据。 以下是collections模块中一些常用的数据结构和容器类型的介绍: 1. Counter(计数器):Counter是一个用于计数的容器,它可以帮助我们快速统计一个可迭代对象中各个元素的出现次数。可以使用Counter类来创建一个计数器对象,并使用它的方法进行计数操作。 2. defaultdict(默认字典):defaultdict是一个字典的子类,它可以为字典中不存在的键提供一个默认值。当我们访问一个不存在的键时,defaultdict会自动创建一个默认值,并将其作为该键的值返回。 3. OrderedDict(有序字典):OrderedDict是一个有序字典,它会记住元素的插入顺序。与普通字典不同,OrderedDict会保持元素的顺序不变,无论是通过插入还是通过更新。 4. namedtuple(命名元组):namedtuple是一个创建具有命名字段的元组的工厂函数。它可以帮助我们创建一个具有可读性和自文档性的数据结构。 5. deque双端队列):deque是一个双端队列,它可以在两端高效地进行插入和删除操作。与列表相比,deque在插入和删除元素时具有更好的性能。 6. ChainMap(链式映射):ChainMap是一个将多个字典或映射组合在一起的工具。它可以将多个字典或映射视为一个逻辑上的整体,并提供统一的访问接口。 7. namedtuple(命名元组):namedtuple是一个创建具有命名字段的元组的工厂函数。它可以帮助我们创建一个具有可读性和自文档性的数据结构。 8. defaultdict(默认字典):defaultdict是一个字典的子类,它可以为字典中不存在的键提供一个默认值。当我们访问一个不存在的键时,defaultdict会自动创建一个默认值,并将其作为该键的值返回。 9. OrderedDict(有序字典):OrderedDict是一个有序字典,它会记住元素的插入顺序。与普通字典不同,OrderedDict会保持元素的顺序不变,无论是通过插入还是通过更新。 10. deque双端队列):deque是一个双端队列,它可以在两端高效地进行插入和删除操作。与列表相比,deque在插入和删除元素时具有更好的性能。 11. ChainMap(链式映射):ChainMap是一个将多个字典或映射组合在一起的工具。它可以将多个字典或映射视为一个逻辑上的整体,并提供统一的访问接口。 以上是collections模块中一些常用的数据结构和容器类型的介绍。你可以根据自己的需求选择合适的数据结构来处理数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lady_killer9

感谢您的打赏,我会加倍努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值