python中deque模块详解

本文介绍了 Python 标准库 collections 中的 deque 模块,包括 deque 的创建、基本操作、两端 pop 操作、限制长度及添加 list 到 deque 等特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在pythonTip做题的时候,遇到了deque模块,以前对其不太了解,现在特此总结一下

deque模块是python标准库collections中的一项,它提供了两端都可以操作的序列,这意味着,在序列的前后你都可以执行添加或删除操作。

1.创建deque序列:

from collections import deque

d=deque()

2.deque提供了类似list的操作方法:

d=deque()

d.append(3)

d.append(8)

d.append(1)

那么此时d=deque([3,8,1]),len(d)=3,d[0]=3,d[-1]=1

3.两端都使用pop:

d=deque(‘12345’)

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

d.pop()抛出的是’5’,d.leftpop()抛出的是’1’,可见默认pop()抛出的是最后一个元素。

4.限制deque的长度

d=deque(maxlen=20)

for i in range(30):

    d.append(str(i))

此时d的值为d=deque(['10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29'], maxlen=20),可见当限制长度的deque增加超过限制数的项时,另一边的项会自动删除。

5.添加list各项到deque中:

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

d.extend([0])

那么此时d=deque([1,2,3,4,5,0])

d.extendleft([6,7,8])

此时d=deque([8, 7, 6, 1, 2, 3, 4, 5, 0])

 

通过以上的一些操作,我们大致可以了解deque()的性质了。

### Python `deque` 数据结构详解 #### 一、什么是 `deque` `deque` 是一种双端队列(Double-ended Queue),允许在 O(1) 时间复杂度下从两端添加和删除元素[^3]。 它既具备队列的功能,也支持栈的操作,因此非常适合需要频繁在一端或两端进行插入和删除的应用场景[^4]。 --- #### 二、如何导入 `deque` 要使用 `deque`,需先从 `collections` 模块中导入: ```python from collections import deque ``` --- #### 三、创建 `deque` 可以通过以下方式创建一个 `deque` 对象: 1. **空的 `deque`** ```python d = deque() print(d) # 输出: deque([]) ``` 2. **基于可迭代对象初始化** ```python d = deque([1, 2, 3]) print(d) # 输出: deque([1, 2, 3]) [^5] ``` 3. **设置最大长度 (`maxlen`)** 如果设置了 `maxlen` 参数,当 `deque` 达到指定的最大长度时,新增加的元素会自动从另一端弹出。 ```python d = deque(maxlen=3) d.append(1) d.append(2) d.append(3) print(d) # 输出: deque([1, 2, 3], maxlen=3) d.append(4) # 新增元素 4,最左侧的 1 自动被移除 print(d) # 输出: deque([2, 3, 4], maxlen=3) [^5] ``` --- #### 四、`deque` 常见操作 ##### 1. 插入元素 - **右侧插入**: 使用 `append(x)` 方法,在右端添加元素。 ```python d = deque([1, 2, 3]) d.append(4) print(d) # 输出: deque([1, 2, 3, 4]) [^3] ``` - **左侧插入**: 使用 `appendleft(x)` 方法,在左端添加元素。 ```python d.appendleft(0) print(d) # 输出: deque([0, 1, 2, 3, 4]) [^3] ``` - **批量插入**: - 右侧扩展: 使用 `extend(iterable)` 方法,将可迭代对象中的所有元素依次添加到右端。 ```python d.extend([5, 6]) print(d) # 输出: deque([0, 1, 2, 3, 4, 5, 6]) [^3] ``` - 左侧扩展: 使用 `extendleft(iterable)` 方法,将可迭代对象中的所有元素逆序添加到左端。 ```python d.extendleft([-1, -2]) print(d) # 输出: deque([-2, -1, 0, 1, 2, 3, 4, 5, 6]) [^3] ``` ##### 2. 删除元素 - **右侧删除**: 使用 `pop()` 方法,移除并返回右端的第一个元素。 ```python last_item = d.pop() print(last_item) # 输出: 6 print(d) # 输出: deque([-2, -1, 0, 1, 2, 3, 4, 5]) [^3] ``` - **左侧删除**: 使用 `popleft()` 方法,移除并返回左端的第一个元素。 ```python first_item = d.popleft() print(first_item) # 输出: -2 print(d) # 输出: deque([-1, 0, 1, 2, 3, 4, 5]) [^3] ``` ##### 3. 其他操作 - **清空 `deque`**: 使用 `clear()` 方法,移除所有元素。 ```python d.clear() print(d) # 输出: deque([]) [^3] ``` - **复制 `deque`**: 使用 `copy()` 方法,创建一个新的 `deque` 实例。 ```python d = deque([1, 2, 3]) new_d = d.copy() print(new_d) # 输出: deque([1, 2, 3]) [^3] ``` - **统计元素出现次数**: 使用 `count(x)` 方法,计算某个值在 `deque` 中出现的次数。 ```python count_of_2 = d.count(2) print(count_of_2) # 输出: 1 [^3] ``` - **查找元素索引**: 使用 `index(x[, start[, stop]])` 方法,找到某个值首次出现的位置。 ```python index_of_2 = d.index(2) print(index_of_2) # 输出: 1 ``` - **旋转 `deque`**: 使用 `rotate(n)` 方法,将 `deque` 中的所有元素向右移动 n 步;如果 n 为负数,则向左移动。 ```python d = deque([1, 2, 3, 4]) d.rotate(1) print(d) # 输出: deque([4, 1, 2, 3]) d.rotate(-2) print(d) # 输出: deque([2, 3, 4, 1]) ``` --- #### 五、应用场景 1. **队列实现**: 当需要先进先出(FIFO)的行为时,可以使用 `deque` 的 `append()` 和 `popleft()` 方法。 2. **栈实现**: 当需要后进先出(LIFO)的行为时,可以使用 `append()` 和 `pop()` 方法。 3. **滑动窗口**: 利用 `deque` 的固定大小特性,适合处理滑动窗口算法问题。 4. **缓存管理**: 设置 `maxlen` 参数,可用于实现简单的 LRU 缓存机制。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值